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";
}