0

私は現在、言語情報を含むファイルを順次 (256 バイト) 読み取る必要があるプロジェクトに取り組んでいます。したがって、文字列オフセット 0 は言語コード 1 の値を開始し、オフセット 256 は言語コード 2 の値を開始します...

ただし、ファイルのエンコーディングは正確にはわかりません。著者は、ファイルが Unicode でエンコードされていると述べています。これは、BOM なしの UCS2 LE として識別される Notepad++ で開くことによって確認されます。

次のように、テキストを 255 バイト長のチャンクに分割する前に、テキストを変換しようとしています。

$content = mb_convert_encoding($content, 'UTF-8', 'UCS-2LE');

これは " Пользователь заблокирован" のような値を生成します。私はこのファイルがロシア語であることを知っているので、有望に見えます。ただし、正しくないように見える値がまだあります。

"┐. ð¢ð░Ðüð¥Ðü ÐëðÁð╗ð¥Ðçð©       ð£ð░"

このコードで変換すると、同じ結果が得られます。

$content = iconv('UTF-16', 'UTF-8', $content);

さまざまなソースから取得したさまざまなエンコーディングを次に示します。

Author:
    "Unicode"

file -i <FILENAME>
    "<FILENAME>: application/octet-stream; charset=binary"

mb_detect_encoding($content);
    "UTF-8"

Notepad++:
    "UCS-2 LE w/o BOM"

そして、ここにファイルの一部があります( で抽出viされ、わかりやすくするために改行が追加されています):

^_^D>^D;^D=^DK^D9^D ^@0^D4^D@^D5^DA^D ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@
^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ 
^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ 
^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ 
^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ 
^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ 
^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ 
^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ 
^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ 
^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@L^@a^@n^@g^@u
^@a^@g^@e^@ ^@S^@p^@r^@a^@c^@h^@e^@ ^@L^@a^@n^@g^@u^@e^@ ^@L^@i^@n^@g^@u^@a^@ 
^@I^@d^@i^@o^@m^@a^@ ^@/^D7^DK^D:^D ^@B^@a^@h^@a^@s^@a^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ 
^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ 
^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ 
^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ 
^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ 
^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ 
^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ 
^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ 
^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@^P^D4^D@^D5^DA^D ^@=^D0^D7^D=
^D0^DG^D5^D=^D8^DO^D ^@

このファイルを読み取って、PHP で正しいエンコーディングに変換するにはどうすればよいですか? そして、今はどのエンコーディングですか?前もって感謝します!

4

2 に答える 2

0

$content = iconv('UTF-16', 'UTF-8', $content); を使用したテスト いいけどUTF-16だけじゃなくてUTF-16LE

<?php
    $content = file_get_contents('ru.txt');
    $content = iconv('UTF-16LE', 'UTF-8', $content);
?>
<html>
<head>
    <title>encodage</title>
    <meta charset="UTF-8">
</head>
<body>
    <?php
        echo $content;
    ?>
</body>
</html>

それが良いかどうかはわかりません(ロシア語を理解できません)が、それは私の出力です:

Полный адрес 言語 Sprache Langue Lingua Idioma Язык Bahasa Адрес назначения ...

編集:エンコーディングを知るために、私は亀のみを使用します。2 つのファイル (ru.txt とその他) を選択し、比較ファイルを実行します。そしてカメはエンコーディングを示します。画面を見てください:

ここに画像の説明を入力

于 2016-04-21T09:41:46.720 に答える
0

エンコーディングが問題ではなく、後で分割されたようです。str_split結果の文字列を同じ長さのエントリを持つ配列に変換していました。ただし、ドキュメンテーションに次のように記載されていることに気づきませんでした。

str_split()は、マルチバイトでエンコードされた文字列を扱う場合、文字ではなくバイトに分割します。

を使用wc -cwc -mて、結果の要素の文字数は同じであることがわかりましたが、バイト数はそうではありませんでした。そのため、いくつかの時点で str_split は文字をバイト間で分割します。

マルチバイト文字列をバイト単位で分割する組み込み関数が見つからないため、ここに投稿されたものと同様の関数を使用しました。

于 2016-04-21T10:33:10.790 に答える