unicode utf-16 代理项对打印问题
unicode utf-16 surrogate pair print problem
在Visual Studio/C++中声明了一个wstring c并用代理对填充它(Unicode 0001F01C =麻红瓦片)
std::cout << std::hex << 16;
std::cout << "Hello World!\n";
std::wstring c = L"\U0001F01C";
wchar_t* ctest = &c[0];
std::cout << "Checking value: " << *ctest << ".." << endl;
当我打印出值时,我希望得到这个 Unicode Number 。但是我得到 d83c.
谁能告诉我为什么我没有得到 Unicode 值?
10Hello World!
Checking value: d83c..
您只需执行创建 UTF-16 代理对的反向操作即可。
U+10000 到 U+10FFFF
从代码点中减去 0x010000,留下 0..0x0FFFFF 范围内的 20 位数字。
将前十位(0..0x03FF 范围内的数字)添加到 0xD800 以给出第一个 16 位代码单元或高代理项,其范围为 0xD800..0xDBFF。
将低十位(也在 0..0x03FF 范围内)添加到 0xDC00 以提供第二个 16 位代码单元或低代理项,其范围为 0xDC00..0xDFFF。
要将代理对重构为 Unicode 代码点,只需执行相反的操作:
#include <cstdint>
#include <iostream>
#include <string>
int main() {
std::cout << std::hex << 16 << "\n";
std::cout << "Hello World!\n";
std::u16string c = u"\U0001F01C";
char16_t* ctest = &c[0];
std::cout << "Checking value: " << *ctest << ".." << "\n";
std::cout << "Checking value: " << ((static_cast<std::uint32_t>(ctest[0] & 0x03FF) << 10) | (ctest[1] & 0x03FF) | 0x10000U) << ".." << "\n";
}
在Visual Studio/C++中声明了一个wstring c并用代理对填充它(Unicode 0001F01C =麻红瓦片)
std::cout << std::hex << 16;
std::cout << "Hello World!\n";
std::wstring c = L"\U0001F01C";
wchar_t* ctest = &c[0];
std::cout << "Checking value: " << *ctest << ".." << endl;
当我打印出值时,我希望得到这个 Unicode Number 。但是我得到 d83c.
谁能告诉我为什么我没有得到 Unicode 值?
10Hello World!
Checking value: d83c..
您只需执行创建 UTF-16 代理对的反向操作即可。
U+10000 到 U+10FFFF
从代码点中减去 0x010000,留下 0..0x0FFFFF 范围内的 20 位数字。
将前十位(0..0x03FF 范围内的数字)添加到 0xD800 以给出第一个 16 位代码单元或高代理项,其范围为 0xD800..0xDBFF。
将低十位(也在 0..0x03FF 范围内)添加到 0xDC00 以提供第二个 16 位代码单元或低代理项,其范围为 0xDC00..0xDFFF。
要将代理对重构为 Unicode 代码点,只需执行相反的操作:
#include <cstdint>
#include <iostream>
#include <string>
int main() {
std::cout << std::hex << 16 << "\n";
std::cout << "Hello World!\n";
std::u16string c = u"\U0001F01C";
char16_t* ctest = &c[0];
std::cout << "Checking value: " << *ctest << ".." << "\n";
std::cout << "Checking value: " << ((static_cast<std::uint32_t>(ctest[0] & 0x03FF) << 10) | (ctest[1] & 0x03FF) | 0x10000U) << ".." << "\n";
}