Re: [問題] does not map to big5-eten

看板Perl作者時間14年前 (2011/03/22 13:36), 編輯推噓3(300)
留言3則, 2人參與, 最新討論串3/4 (看更多)
以下分享一下處理 charset encoding 的經驗: 如果來源的資料有確定的 charset,那麼您可以考慮 將它轉為 Perl's string (不需考慮 Perl 內部實際的編碼方式), 再交給模組去處理,最後再依據目的 charset 輸出資料。 如: 1. big5 (bytes) => Perl's string (chars) => utf-8 (bytes) 2. utf-8 (bytes) => Perl's string (chars) => big5 (bytes) 3. big5 mix utf-8 (bytes) => Perl's string (chars) => utf-8 (bytes) 對於來源資料的 charset 如果沒有明確指定,或是如 big5 mix utf-8 這種存在多種 charset 混在一起的, 可以使用 Encode::Guess 來處理。這常見於抓取網頁 內容,但未告知明確的 charset,或是內容與宣告的 charset 不一致。 以下是針對網頁內容存在 big5 mix utf-8 都轉成 utf-8: use Encode::Guess qw(big5-eten); sub convert_to_utf8 { my ($data) = @_; my $result = ''; my $p_str = ''; my $utf8 = ''; for ( split( /\r?\n/, $data ) ) { my $enc = guess_encoding($_); if ( ref($enc) ) { # convert $p_str = decode( $enc->name, $_ ); # perl-string $utf8 = encode( 'utf8', $p_str ); # utf8 } else { # no conversion $utf8 = $_; } $result .= "$utf8\n"; } return $result; } 另外,再分享一個將 utf-8 轉成 big5 的作法, 轉不過去的就改用 html entities 表示: use HTML::Entities; sub utf8_to_big5 { my ( $str, $is_safe ) = @_; $is_safe = defined($is_safe) ? $is_safe : 1; my $result = ''; if ($is_safe) { my $ucs = decode( "utf-8", $str ); foreach ( split( //, $ucs ) ) { my $c = encode( "big-5", $_, Encode::FB_QUIET ); $c = encode_entities($_) if ( $c eq '' ); $result .= $c; } } else { $result = $str; from_to( $result, "utf-8", "big5" ); } return $result; } ※ 引述《StarTouching (撫星)》之銘言: : 我現在在玩HTML Parser模組 : 不過我發現我抓完網頁嘗試印出某些資料時出現這個訊息: : "\x{00a0}" does not map to big5-eten at..... : 我查了一下 00a0在unicode中是 「無斷行空格」 : big5疑似不支援 : 我的Perl檔開頭有加 : use encoding 'big5', Filter=>1; : 其實我看不懂這行的細節, 只是抄駱馬書翻譯者的譯註。 : 我想問, 我自己想到幾個解決方向 何者可行? : 1. : 讓整個perl都支援unicode, 但對parse網頁來說 可能需要進一步判斷網頁編碼 : 另外parser本身是否可以判讀unicode也可能會是在我們無力控制的範圍 : 2. : 只要能在程式中能識別出這樣的內碼, 那麼我們就可以選擇 避開 : 或是以big5既有的字符取代印出 (例如以一般空格取代無斷行空格) : 我測試了 s/\x{00a0}// 可以成功 : 但會有個額外的問題: : 這個做法能延伸到unicode的一段範圍嗎? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.114.64.130

03/22 16:23, , 1F
03/22 16:23, 1F

03/22 18:03, , 2F
好像要多 use Encode; 才能運作
03/22 18:03, 2F

03/22 19:21, , 3F
from_to 要引用甚麼模組啊?
03/22 19:21, 3F
文章代碼(AID): #1DY3Ldht (Perl)
文章代碼(AID): #1DY3Ldht (Perl)