3

http://www.gnu.org/software/libiconv/には、中国語の 20 種類のエンコーディングがあります。

中国語 EUC-CN、HZ、GBK、CP936、GB18030、EUC-TW、BIG5、CP950、BIG5-HKSCS、BIG5-HKSCS:2004、BIG5-HKSCS:2001、BIG5-HKSCS:1999、ISO-2022-CN、ISO -2022-CN-EXT

だから私はUTF-8ではないテキストファイルを持っています. アスキーです。そして、を使用してUTF-8に変換したいと思いiconv()ます。しかしそのためには、ソースの文字エンコーディングを知る必要があります。

中国語が分からないのにどうすればいいですか?:(

きがついた:

$str = iconv('GB18030', 'UTF-8', $str);
file_put_contents('file.txt', $str);

UTF-8 でエンコードされたファイルを生成しますが、私が試した他のエンコーディング (CP950、GBK、および EUC-CN) では ASCII ファイルが生成されました。iconvこれは、指定された文字列の入力エンコーディングが間違っているかどうかを検出できることを意味しますか?

4

3 に答える 3

3

これあなたのニーズに合うかもしれません(しかし、私にはわかりません)。ロケールと utf8_decode を設定し、mt_detect_encoding のmb_check_encoding代わりに使用すると、有用な出力が得られるようです。

// some text from http://chinesenotes.com/chinese_text_l10n.php
// have tried both as string and content loaded from a file
$chinese = '譧躆 礛簼繰 剆坲姏 潧 騔鯬 跠 瘱瘵瘲 忁曨曣 蛃袚觙';
$chinese=utf8_decode($chinese);

$chinese_encodings ='EUC-CN,HZ,GBK,CP936,GB18030,EUC-TW,BIG5,CP950,BIG5-HKSCS,BIG5-HKSCS:2004,BIG5-HKSCS:2001,BIG5-HKSCS:1999,ISO-2022-CN,ISO-2022-CN-EXT';

$encodings = explode(',',$chinese_encodings);

//set chinese locale
setlocale(LC_CTYPE, 'Chinese');

foreach($encodings as $encoding) {
    if (@mb_check_encoding($chinese, $encoding)) {
        echo 'The string seems to be compatible with '.$encoding.'<br>';
    } else {
        echo 'Not compatible with '.$encoding.'<br>';
    }
}

出力

The string seems to be compatible with EUC-CN
The string seems to be compatible with HZ
The string seems to be compatible with GBK
The string seems to be compatible with CP936
Not compatible with GB18030
The string seems to be compatible with EUC-TW
The string seems to be compatible with BIG5
The string seems to be compatible with CP950
Not compatible with BIG5-HKSCS
Not compatible with BIG5-HKSCS:2004
Not compatible with BIG5-HKSCS:2001
Not compatible with BIG5-HKSCS:1999
Not compatible with ISO-2022-CN
Not compatible with ISO-2022-CN-EXT

全くの推測です。現在、少なくとも中国語のエンコーディングの一部を認識しているようです。完全ジャンクでしたら削除します。

于 2013-09-27T21:11:35.627 に答える
2

私は中国語のエンコーディングの経験がなく、この質問がタグ付けされていることは知っていますが、それで問題が解決する場合は、エンコーディングを検出するためにmb_detect_encodingiconvを試すことができます。2 番目の引数はチェックするエンコーディングのリストで、中国語のエンコーディングに関するユーザー作成のコメントがあります。

中国の開発者の場合: この関数の 2 番目の引数には「GB2312」と「GBK」は含まれず、GB2312 文字列として検出された場合の戻り値は「EUC-CN」であることに注意してください。

中国語のエンコーディングの完全なリストを2番目の引数として明示的に指定するとうまくいくでしょうか?次のように機能します。

$encoding = mb_detect_encoding($chineseString, 'GB2312,GBK,(...)');
if($encoding) $utf8text = iconv($encoding, 'UTF-8', $str);

strict3 番目の引数 ( )で遊ぶこともできます。

于 2013-09-27T20:10:00.480 に答える
2

エンコーディングの検出を困難にしているのは、オクテット シーケンスが複数のエンコーディングで有効な文字にデコードされるという事実ですが、結果は正しいエンコーディングでのみ意味があります。これらの場合に私が行ったことは、デコードされたテキストを取得して自動翻訳サービスにアクセスし、判読可能なテキストまたは音節の寄せ集めが返されるかどうかを確認することです.

たとえば、入力テキストのトライグラフ頻度を分析することにより、プログラムでこれを行うことができます。このようなライブラリは、この問題を解決するためにすでに作成されており、それを行う外部プログラムもありますが、PHP API を使用したものはまだ見たことがありません。ただし、このアプローチは絶対確実ではありません。

于 2013-09-27T23:15:13.810 に答える