1

などのパラメータから文字列データを取得しまし��た。

これらは、10 進数で表された Unicode の UTF-16 サロゲート ペアです。

標準ライブラリで「U+1F62C」などの Unicode コード ポイントに変換するにはどうすればよいですか?

4

1 に答える 1

3

で簡単にできます。高い Unicode ポイントからサロゲート ペアに渡して戻るためのアルゴリズムはそれほど難しくありません。UTF16に関するウィキペディアのページには次のように書かれています。

U+10000 ~ U+10FFFF

  • コード ポイントから 0x010000 が減算され、範囲 0..0x0FFFFF の 20 ビット数が残ります。
  • 上位 10 ビット (0..0x03FF の範囲の数値) が 0xD800 に追加され、最初の 16 ビット コード ユニットまたは上位サロゲートが与えられます。これは、0xD800..0xDBFF の範囲になります。
  • 下位 10 ビット (これも 0..0x03FF の範囲内) が 0xDC00 に追加され、2 番目の 16 ビット コード ユニットまたは下位サロゲートが与えられます。これは、0xDC00..0xDFFF の範囲内になります。

これは単なるビット単位の and、or、および shift であり、C または C++ で自明に実装できます。


標準ライブラリを使用したいとおっしゃったように、あなたが求めているのは、2 つの 16 ビット UTF-16 サロゲートから 1 つの 32 ビット Unicode コード ポイントへの変換codecvtです。C++11 モードまたはより高い。

リトルエンディアン アーキテクチャで値を処理する例を次に示します。

#include <iostream>
#include <locale>
#include <codecvt>

int main() {
    std::codecvt_utf16<char32_t, 0x10ffffUL,
    std::codecvt_mode::little_endian> cvt;
    mbstate_t state;

    char16_t pair[] = { 55357, 56842 };
    const char16_t *next;

    char32_t u[2];
    char32_t *unext;

    cvt.in(state, (const char *) pair, (const char *) (pair + 2),
        (const char *&) next, u, u+1, unext);

    std::cout << std::hex << (uint16_t) pair[0] << " " << (uint16_t) pair[1]
        << std::endl;
    std::cout << std::hex << (uint32_t) u[0] << std::endl;

    return 0;
}

出力は期待どおりです。

d83d de0a
1f60a
于 2016-02-22T09:58:50.983 に答える