などのパラメータから文字列データを取得しまし��
た。
これらは、10 進数で表された Unicode の UTF-16 サロゲート ペアです。
標準ライブラリで「U+1F62C」などの Unicode コード ポイントに変換するにはどうすればよいですか?
などのパラメータから文字列データを取得しまし��
た。
これらは、10 進数で表された Unicode の UTF-16 サロゲート ペアです。
標準ライブラリで「U+1F62C」などの Unicode コード ポイントに変換するにはどうすればよいですか?
手で簡単にできます。高い Unicode ポイントからサロゲート ペアに渡して戻るためのアルゴリズムはそれほど難しくありません。UTF16に関するウィキペディアのページには次のように書かれています。
これは単なるビット単位の 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