gpt4 book ai didi

c++ - 如何在 C++ 中将 UTF-16 代理十进制转换为 UNICODE

转载 作者:行者123 更新时间:2023-11-30 03:44:20 24 4
gpt4 key购买 nike

我从参数中得到了一些字符串数据,例如 ��

这些是 Unicode 的 UTF-16 代理对,以十进制表示。

如何使用标准库将它们转换为 Unicode 代码点,例如“U+1F62C”?

最佳答案

您可以轻松手动。从高 unicode 点传递到代理对并返回的算法并不难。 UTF16 上的维基百科页面说:

U+10000 到 U+10FFFF

  • 从代码点中减去 0x010000,留下 0..0x0FFFFF 范围内的 20 位数字。
  • 将前十位(0..0x03FF 范围内的数字)添加到 0xD800 以提供第一个 16 位代码单元或高代理项,其范围为 0xD800..0xDBFF。
  • 将低十位(也在 0..0x03FF 范围内)添加到 0xDC00 以提供第二个 16 位代码单元或低位代理项,其范围为 0xDC00..0xDFFF。

这只是按位与、或和移位,可以在 C 或 C++ 中轻松实现。


正如你所说你想使用标准库,你要求的是从两个 16 位 UTF-16 代理到一个 32 位 unicode 代码点的转换,所以 codecvt 是你的 friend ,前提是您可以在 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

关于c++ - 如何在 C++ 中将 UTF-16 代理十进制转换为 UNICODE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35547440/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com