一部の絵文字には次のような2つのutf-8コードがあるという問題が見つかりました。
emoji unicode utf-8 another utf-8
???? U+1F601 \xf0\x9f\x98\x81 \xed\xa0\xbd\xed\xb8\x81
しかし、ios言語は他のタイプのutf-8をデコードできないため、utf-8から文字列をデコードするとエラーが発生します。
私が見つけたすべての文書で、絵文字用のutf-8コードの1つのタイプを見つけることができますが、他の場所を見つける場所はありません。
参照したドキュメントには次のものが含まれます。
しかし、Webツール bianma では、utf-8コードの2種類すべてを絵文字に正しく変換できます。
だから、私の質問は:
1つの絵文字に2種類のutf-8コードがあるのはなぜですか?
2種類のutf-8コードを含むドキュメントはどこにありますか?
IOS言語のNSStringを使用して、utf-8から文字列を正しく変換する方法は?
0xF0、0x9F、0x98、0x81
U + 1F601の正しいUTF-8エンコーディングですか????.
0xED、0xA0、0xBD、0xED、0xB8、0x81
有効なUTF-8シーケンス(*)ではありません。それは本当に拒否されるべきです。 iOSはそうするのが正しいです。
これはbianmaツールのバグです:convertUtf8BytesToUnicodeCodePoints
関数は、たとえば RFC 3629 で指定されたアルゴリズムよりも、どの入力を受け入れるかについて寛容です。
ツールがJavaScriptで記述されているために、これはたまたま作業文字列を返します。上記のバイトシーケンスを偽のサロゲートコードポイントシーケンスU + D83D、U + DE01にデコードすると、コードポイントからコードユニットへの直接マッピングを使用してJavaScript文字列に変換し、\uD83D\xDE01
。これがエンコードの正しい方法ですか???? UTF-16文字列では、機能しているように見えます。
(*:Itisは有効なCESU-8シーケンスですが、そのエンコーディングは単に「誤って記述された歴史的なツールとの互換性のために偽の壊れたエンコーディング」であり、一般的に避けてください。)
通常、このようなシーケンスは発生しません。通常、この種の不正なデータの特定のソースがあり、修正する権限がない場合を除いて、ケータリングする価値はありません。
これはphpで絵文字付きのメッセージを電報ボットに送信するのに役立ちました:
$message_text = " \xf0\x9f\x98\x81 ";