gpt4 book ai didi

c++ - HEX 字符串转 UTF-8(UNICODE) 字符串

转载 作者:行者123 更新时间:2023-11-27 23:38:35 39 4
gpt4 key购买 nike

我有一个包含 Unicode 字符的 HEX 字符串。我需要转换那个 UTF-8(Unicode) 并存储在一个字符串变量中。

我是 Unicode 的新手,我没有太多想法去尝试任何东西。

std::string HEX_string= "0635 0628 0627 062d 0020 0627 0644 062e 064a 0631";
std:string unicode_string=getUnicodeString(HEX_string);

我希望 ain unicode_string 变量中的 ain 值。

最佳答案

由于该十六进制字符串是一堆以空格分隔的 base-16 编码 Unicode 代码点,因此仅使用标准函数即可轻松转换,特别是 std::c32rtomb() :

#include <iostream>
#include <string>
#include <sstream>
#include <cstdlib>
#include <clocale>
#include <cuchar>
#include <climits>

std::string
getUnicodeString(const std::string &hex)
{
std::istringstream codepoints{hex};
std::string cp;
std::string out;
std::mbstate_t state;
char u8[MB_LEN_MAX];

while (codepoints >> cp) {
char32_t c = std::stoul(cp, nullptr, 16);
auto len = std::c32rtomb(u8, c, &state);
if (len == std::size_t(-1)) {
std::cerr << "Unable to convert " << cp << " to UTF-8 codepoint!\n";
std::exit(EXIT_FAILURE);
} else if (len > 0) {
out.append(u8, len);
}
}
return out;
}

int main() {
// Make sure that c32rtomb() works with UTF-32 code units
static_assert(__STDC_UTF_32__);
// Requires a UTF-8 locale to get a UTF-8 string.
std::setlocale(LC_ALL, "");

std::string HEX_string = "0635 0628 0627 062d 0020 0627 0644 062e 064a 0631";
std::string unicode_string = getUnicodeString(HEX_string);
std::cout << unicode_string << '\n';
return 0;
}

编译后运行结果:

$ echo $LANG
en_US.utf8
$ ./a.out
صباح الخير

在该示例中,您在 BMP 之外没有任何代码点来确定您的输入是以 UTF-16 还是 UTF-32 编码的。上面的代码假定为 UTF-32,但如果它是 UTF-16,你可以将 c32rtomb() 更改为 c16rtomb() 并将 char32_t 更改为 char16_t 它将正确处理 UTF-16 代理对。

关于c++ - HEX 字符串转 UTF-8(UNICODE) 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57308743/

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