2

PHPを使用して、次のようなUnicode文字を含むテキストファイルを解析します

スマイリーをさらにエンコード/デコードせずにファイルを読み込むだけで、解析され、json_encoded になり、出力は次のようになります。\u00f0\u009f\u0098\u008d

JavaScript ファイルは .json データを取得し、エスケープされた 4 文字を次のように出力します。ð

ユニコード表を見ると、シンボルは「SMILING FACE WITH HEART-SHAPED EYES」と呼ばれ、ユニコード番号U+1F60D(128525)を持っています

この場合、4 つのコード単位を unicodenumber または理想的には適切な html エンコードされた方法に変換する方法はありますか😍

変換を見ると、utf 8 コード単位は似ていますが (F0 9F 98 8D 0A 0A)、取得した 4 つのエスケープ単位を再現できないため、何を見ているのかさえわかりません。

更新: 私は間違いを犯し、2 番目の段落を編集しました:\u00f0\u009f\u0098\u008d既に json_encode(); の結果です。

これは、ファイルからデータを読み取る基本的な関数です。ソースを見ると、スマイリーは「ハードコード」されているため、実際に表示されます

function readLocalFile() {
  $file_html = fopen('output.html', "r");
  $html = "";

  while(!feof($file_html)) {
    $html .= fgets($file_html);
  }

  fclose($file_html);

  // here I use regex to filter for specific tags, the result is an array
  $cleanData = parseData($html);

  saveToFile(json_encode($cleanData)); 
}

コンテンツと同じようにダミー.htmlを作成したところ、これは正しい結果\ud83d\ude0dを返しますが、データ全体のコンテキストでは、上記のようにまだ壊れています。

データが に保存される方法を確認する必要がoutput.htmlあります。そこに問題があるはずです。私はずっと問題の間違った部分を見てきました。

最終更新: ようやくエラーが見つかりました。それはparseData関数にあり、loadHTMLはどういうわけかコンテンツを文字化けし、ここで解決策を見つけました: PHP DOMDocument loadHTMLがUTF-8を正しくエンコードしていません

4

2 に答える 2

1

あなたが持っているのは、ISO-8859-1(latin1)としてUnicodeにデコードされたUTF-8データであり、次にJSONエンコードされています。もし、あんたが:

  1. JSON を Unicode にデコードします。
  2. latin-1 でバイトにエンコードします。
  3. UTF-8 で Unicode にデコードします。

これにより、正しい文字が得られるはずです。私はPHPをしませんが、Pythonの証明は次のとおりです。

>>> '\u00f0\u009f\u0098\u008d'.encode('latin1').decode('utf8')
'\U0001f60d'
>>> import unicodedata as ud
>>> ud.name('\U0001f60d')
'SMILING FACE WITH HEART-SHAPED EYES'

そもそもデータがどのように文字化けしたかは、HTML が実際には UTF-8 でエンコードされていたのに、ISO-8859-1 または Windows-1252 と誤って宣言されていた可能性があります。

于 2013-09-06T06:16:48.493 に答える