gpt4 book ai didi

C++ 将 ASII 转义的 unicode 字符串转换为 utf8 字符串

转载 作者:搜寻专家 更新时间:2023-10-31 01:01:42 25 4
gpt4 key购买 nike

我需要读入带有 unicode 转义的标准 ascii 样式字符串,并将其转换为包含 utf8 编码等价物的 std::string。因此,例如“\u03a0”(具有 6 个字符的 std::string)应转换为原始二进制中具有两个字符的 std::string,分别为 0xce 和 0xa0。

如果有一个使用 icu 或 boost 的简单答案,我会很高兴,但我一直找不到。

(这类似于 Convert a Unicode string to an escaped ASCII string ,但注意我最终需要达到 UTF8 编码。如果我们可以使用 Unicode 作为中间步骤,那很好。)

最佳答案

尝试这样的事情:

std::string to_utf8(uint32_t cp)
{
/*
if using C++11 or later, you can do this:

std::wstring_convert<std::codecvt_utf8<char32_t>, char32_t> conv;
return conv.to_bytes( (char32_t)cp );

Otherwise...
*/

std::string result;

int count;
if (cp <= 0x007F)
count = 1
else if (cp <= 0x07FF)
count = 2;
else if (cp <= 0xFFFF)
count = 3;
else if (cp <= 0x10FFFF)
count = 4;
else
return result; // or throw an exception

result.resize(count);

if (count > 1)
{
for (int i = count-1; i > 0; --i)
{
result[i] = (char) (0x80 | (cp & 0x3F));
cp >>= 6;
}

for (int i = 0; i < count; ++i)
cp |= (1 << (7-i));
}

result[0] = (char) cp;

return result;
}

std::string str = ...; // "\\u03a0"
std::string::size_type startIdx = 0;
do
{
startIdx = str.find("\\u", startIdx);
if (startIdx == std::string::npos) break;

std::string::size_type endIdx = str.find_first_not_of("0123456789abcdefABCDEF", startIdx+2);
if (endIdx == std::string::npos) break;

std::string tmpStr = str.substr(startIdx+2, endIdx-(startIdx+2));
std::istringstream iss(tmpStr);

uint32_t cp;
if (iss >> std::hex >> cp)
{
std::string utf8 = to_utf8(cp);
str.replace(startIdx, 2+tmpStr.length(), utf8);
startIdx += utf8.length();
}
else
startIdx += 2;
}
while (true);

关于C++ 将 ASII 转义的 unicode 字符串转换为 utf8 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28534221/

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