Re: [問題] does not map to big5-eten
以下分享一下處理 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
03/22 18:03, 2F
推
03/22 19:21, , 3F
03/22 19:21, 3F
討論串 (同標題文章)
Perl 近期熱門文章
PTT數位生活區 即時熱門文章