ユニコードが17ビットコードポイントを使用する場合、サロゲートペアはコードポイントからどのように計算されますか?サロゲートペアはどのように計算されますか?
答えて
Unicodeコードポイントは、0x000000から0x10FFFFの範囲のスカラー値です。つまり、17ビットではなく、21ビットの整数です。
サロゲートペアは、UTF-16形式のメカニズムです。これは、21ビットのスカラ値を1つまたは2つの16ビットコード単位として表します。
- 0x000000から0x00FFFFまでのスカラー値は、0x0000から0xFFFFまでの単一の16ビットコード単位で表されます。
- 0x00D800から0x00DFFFまでのスカラー値は、Unicodeでは文字ではないため、Unicode文字列では決して発生しません。
- 0x010000から0x10FFFFまでのスカラー値は2つの16ビットコード単位で表されます。第1のコードユニットは、0xD800-0xDBFFの範囲のコード単位として、スカラー値の上位11ビットをコード化する。 0x01〜0x10の値を4ビットでエンコードするのはちょっと難しいことです。第2のコードユニットは、0xDC00-0xDFFFの範囲のコード単位として、スカラー値の下位10ビットをコード化する。
これについては、サンプルコードとともに、Unicodeコンソーシアムのよくある質問UTF-8, UTF-16, UTF-32 & BOMで詳しく説明しています。そのFAQは、Unicode Standardのセクションを参照しています。
FAQのサンプルコードでは、サロゲートペアをコードポイントにマッピングする方法について説明しています。問題は逆方向マッピングに関するものでした。これは、Unicode標準の第3章のD91(http://www.unicode.org/versions/Unicode6.0.0/ch03.pdf –
+1)に示されています。 – dalle
@ JukkaK.Korpela、よくある質問を読む[Q:UTF-16から文字コードに変換するアルゴリズムとは何ですか?](http://www.unicode.org/faq//utf_bom.html#utf16-3)私は文字コードからUTF-16へのマッピングとサンプルコードの両方を再び見ることができますが、タイトルはそれを約束しません。 –
あなたが後にあるコードの場合、ここでは単一のコードポイントがそれぞれUTF-16とUTF-8でエンコードされる方法があります。
UTF-16 codeunitsへの単一のコードポイント:UTF-8 codeunitsへ
if (cp < 0x10000u)
{
*out++ = static_cast<uint16_t>(cp);
}
else
{
*out++ = static_cast<uint16_t>(0xd800u + (((cp - 0x10000u) >> 10) & 0x3ffu));
*out++ = static_cast<uint16_t>(0xdc00u + ((cp - 0x10000u) & 0x3ffu));
}
単一のコードポイント:
if (cp < 0x80u)
{
*out++ = static_cast<uint8_t>(cp);
}
else if (cp < 0x800u)
{
*out++ = static_cast<uint8_t>((cp >> 6) & 0x1fu | 0xc0u);
*out++ = static_cast<uint8_t>((cp & 0x3fu) | 0x80u);
}
else if (cp < 0x10000u)
{
*out++ = static_cast<uint8_t>((cp >> 12) & 0x0fu | 0xe0u);
*out++ = static_cast<uint8_t>(((cp >> 6) & 0x3fu) | 0x80u);
*out++ = static_cast<uint8_t>((cp & 0x3fu) | 0x80u);
}
else
{
*out++ = static_cast<uint8_t>((cp >> 18) & 0x07u | 0xf0u);
*out++ = static_cast<uint8_t>(((cp >> 12) & 0x3fu) | 0x80u);
*out++ = static_cast<uint8_t>(((cp >> 6) & 0x3fu) | 0x80u);
*out++ = static_cast<uint8_t>((cp & 0x3fu) | 0x80u);
}
- 1. Rのオブジェクトサイズはどのように計算されますか?
- 2. emはどのように計算されますか?
- 3. Netlab - エラーはどのように計算されますか?
- 4. カフカオフセット値はどのように計算されますか?
- 5. 階乗はどのように計算されますか?
- 6. UIScrollView - showsHorizontalScrollIndicatorはどのように計算されますか?
- 7. gitハッシュはどのように計算されますか?
- 8. CSSグラジエントパスはどのように計算されますか?
- 9. iostatのutilがどのように計算されますか?
- 10. ベースE91、どのように計算されますか?
- 11. EJB3メソッドのハッシュはどこでどのように計算されますか?
- 12. CSS:ブロック要素の高さはどのように計算されますか?
- 13. PostgreSQL - クエリプランのソートノードのコストはどのように計算されますか?
- 14. 3つの割合の比はどのように計算されますか?
- 15. STAN計算の時間スケールと反復回数はどのようにして計算されますか?
- 16. AWS SDKの月間計算機コストはどのように計算されますか?
- 17. SQLの為替レートはどのように計算されますか?
- 18. NCrunch Risk/Progressウィンドウのグラフはどのように計算されますか?
- 19. xgboostの品質はどのように計算されますか?
- 20. フロントエンドのインスタンス時間はアプリエンジンでどのように計算されますか?
- 21. Azureメディアサービスストリーミングユニットのコストはどのように計算されますか?
- 22. この無限リストはどのように計算されますか?
- 23. h2oのRoot Mean Squared Logarithmic Errorはどのように計算されますか?
- 24. Sparkで仮想メモリはどのように計算されますか?
- 25. 平均シーク時間はどのように計算されますか?
- 26. Makefile変数はどのようにして計算されますか?
- 27. Elasticsearch関連性スコアはどのように計算されますか?
- 28. タスクは計算シェーダとどのように分割されますか?
- 29. クリックスクロール量はどのようにしてwinformsスクロールバーで計算されますか?
- 30. 合計はどのように計算できますか? dataGridView列の値のうちどれですか?
あなたは何を意味するのですか? Unicodeコードポイントは17ビットではなく、UTF-8はサロゲートペアを使用しません。 – kennytm
Unicodeコードポイントには約21ビットが必要です。それにもかかわらず、各65536コードポイントの17プレーンを使用すると、合計1114112コードポイントになります。約20.087ビットです。 – dalle