web-dev-qa-db-ja.com

絵文字に2つの異なるutf-8コードがあるのはなぜですか? utf-8から絵文字を変換するには、iosでNSStringを使用しますか?

一部の絵文字には次のような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から文字列をデコードするとエラーが発生します。

ios code


私が見つけたすべての文書で、絵文字用のutf-8コードの1つのタイプを見つけることができますが、他の場所を見つける場所はありません。

参照したドキュメントには次のものが含まれます。

emojiコードリンク

tf-8コードリンク全体

しかし、Webツール bianma では、utf-8コードの2種類すべてを絵文字に正しく変換できます。

input code

ouput


だから、私の質問は:

  1. 1つの絵文字に2種類のutf-8コードがあるのはなぜですか?

  2. 2種類のutf-8コードを含むドキュメントはどこにありますか?

  3. IOS言語のNSStringを使用して、utf-8から文字列を正しく変換する方法は?

12
pinchwang

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シーケンスですが、そのエンコーディングは単に「誤って記述された歴史的なツールとの互換性のために偽の壊れたエンコーディング」であり、一般的に避けてください。)

通常、このようなシーケンスは発生しません。通常、この種の不正なデータの特定のソースがあり、修正する権限がない場合を除いて、ケータリングする価値はありません。

11
bobince

これはphpで絵文字付きのメッセージを電報ボットに送信するのに役立ちました:

$message_text = " \xf0\x9f\x98\x81 ";
0
Polina