当前位置: 首页 > 知识库问答 >
问题:

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

怀飞扬
2023-03-14

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

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

(这类似于将Unicode字符串转换为转义ASCII字符串,但注意到我最终需要达到UTF8编码。如果我们可以使用Unicode作为中间步骤,那就好了。)

共有2个答案

宰父君昊
2023-03-14

试试这样的方法:

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

null

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);
唐增
2023-03-14

(\u03a0是希腊文大写字母PI的Unicode码位,其UTF-8编码为0xCE 0xA0)

您需要:

  1. 字符串“\u03a0”中获取数字0x03a0:删除反斜杠和u并将03a0解析为十六进制,并将其解析为wchar_t。重复直到得到一个(宽的)字符串。
  2. 将0x3A0转换为UTF-8。C++11有一个可能有用的codecvt_utf8。
 类似资料:
  • 问题内容: 我能够从发送消息到上。如果我从发送消息,则使用任何可访问性(包括完整的语言本地化)都没有区别;英语也没有问题。正确的编码很重要,只有以下代码行: 不幸的是,这是无效的。我要从中获取消息的情况有所不同。 在我得到消息的情况下,从Windows操作系统(英语,没有任何语言包),我能够把消息来自于形式。 如果Windows操作系统使用某些语言包进行了完全本地化,则我将收到一个例外 消息缓冲区

  • 问题内容: 我需要将unicode字符串转换为具有以unicode编码的非ascii字符的字符串。例如,字符串“汉字Max”应显示为“ \ u6F22 \ u5B57 Max”。 我尝试过的 的不同组合 新的String(sourceString.getBytes(encoding1),encoding2) Apache StringEscapeUtils也会转义ascii字符,例如双引号 Str

  • 问题内容: 当我尝试使用“ unicode(head.contents [3])”获取标签的内容时,我得到类似于以下的输出:“ Christensen Sk \ xf6ld”。我希望转义序列作为字符串返回。如何在python中做? 问题答案: 假设Python将名称视为普通字符串,则首先必须将其解码为unicode: 实现此目的的另一种方法: 注意字符串前面的“ u”,表示它是未编码的。如果进行打

  • 问题内容: 我有一个包含unicode字符等的字符串,以某种方式不被我接收,但被作为接收。如何将其转换回unicode? 显然不是答案。那是什么 问题答案: Unicode转义仅适用于unicode字符串,因此 实际上是由6个字符组成的字符串:“ \”,“ u”,“ 2”,“ 0”,“ 2”,“ 6”。 要从中制作出unicode,请使用:

  • 问题内容: 我想解组包含JSON的a,但是该函数将a 作为输入。 如何将UTF8转换为? 问题答案: 这个问题可能是如何将字符串分配给bytes数组的重复,但是仍然有答案,因为有更好的替代解决方案: 从转换到由该规范允许的,使用一个简单的转换: 字符串类型之间的转换 […] 将字符串类型的值转换为字节片的类型会产生一个片,其连续元素是字符串的字节。 因此,您可以简单地执行以下操作: 但是,该转换会

  • 问题内容: 我在Java中的字符串变量中具有以下值,该字符串变量具有如下编码的UTF-8字符 代替 (假设我无法控制如何将此值分配给此字符串变量) 现在如何正确转换(编码)并将其存储回String变量中? 我发现以下代码 但这会返回,但我要返回。 编辑: 一些其他信息。 当我使用我得到 我不确定什么是正确的术语(UTF-8或unicode)。 问题答案: 尝试 来自Apache Commons L