Re: [問題] does not map to big5-eten
很感謝liyih大分享這兩個函式,
我想有這兩個函示, 應該就能處理絕大部分的狀況
我把您的code拿來用, 但修改了幾個小地方:
1. 多加上 use Encode; 這樣 encode, decode方能運作
2. 在convert_to_utf8中, 多加入$data是否原本就有\n的判斷
如果沒有 就不必在最後多補上\n
3. $is_safe = $is_safe // 1; #使用defined-or
4. 不過from_to函式仍被說是undefined, 不知道該use哪個模組?
另外我把perl可能會遇到編碼的部分重新思考了一下
1. 輸出部分(print), 目前看來似乎一定要硬轉big5, 才不會有字元map不了的狀況。
也就是說 如果Perl輸出utf-8到Dos, 到最後還是會被轉成 big5
這部份似乎是無解, 所以還是只好自己先在程式裡轉。
至於寫入檔案、在unicode下的Unix等環境情形如何尚待測試
2. 使用者透過STDIN輸入的資料, 處理過程尚未確認。
3. 外部資料, 例如我用LWP::Simple::get抓取的網頁檔,
或是glob "*.txt" 所抓取的檔名資料串,
則可能出現編碼混雜或不明確的狀況
可用l大的函式硬轉utf-8
4. 程式內部字串, 或是要進一步分析外部資料時,
似乎得是big5才有辦法處理。
我原本都是加上 use encoding 'big5', Filter=>1;
但有了l大兩個函式後, 不知道還需不需要這條。
至於Perl到底能不能直接處理unicode?
像Windows底下寫C++, 就支援 L"中文" 這樣的unicode字串常數。
如果把整隻程式存成unicode而不是ANSI的話,
Perl會無法編譯。
所以我的結論是, 如果Perl真的不能處理Unicode,
那麼外部資料都應該轉big5處理(反正最後輸出也是要big5),
而字串常數因為檔案本來就是ANSI存檔, 所以不用特地再轉。
只是要記得 既然要處理big5, 就要加上 use encoding 'big5'
以上是我的一些想法, 也包含了ㄧ些問題。
畢竟 如果能處理所有unicode文字, 這樣才比較方便。
下面是我運用成功的例子:
my @files = glob "相片000??.jpg"; #中文常數 不必額外處理
$_ = utf8_to_big5(convert_to_utf8($_)) foreach (@files);#先硬轉utf8再轉到big5
print join "\n", @files;
比較奇怪的地方是明明檔名理當都是unicode, 卻還是要全轉utf8一次
(猜測可能先被decode過了)
接下來我還會做更多測試, 也希望能把脈絡搞得更清楚。
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 111.243.163.36
※ 編輯: StarTouching 來自: 111.243.163.36 (03/23 01:34)
討論串 (同標題文章)
Perl 近期熱門文章
PTT數位生活區 即時熱門文章