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

转换带有ASCII/UTF8重音的Unicode字母

蔡默
2023-03-14

我正在搜索一种转换服务器发送的字符串(JSON)的技术,该字符串包含以下内容:<code>…“Test\u00e9\u00e9\u002e9”…</code>在类似“Testé”的内容中,我找到了一个解决方案:<code>boost::replace_all(listFolder,\\u00e,é) ,我将这个boost函数与其他字母àùê等一起使用……这太痛苦了!

我想知道是否有函数自动执行这种转换。

否则,我想告诉你别的事情,如果我使用这个函数,服务器将正确处理我发送给它的字符串,并包含带有重音符号的字母:

std::string fromLocale(std::string localeStr)
{
    boost::locale::generator g;
    g.locale_cache_enabled(true);
    std::locale loc = g(boost::locale::util::get_system_locale());
    return boost::locale::conv::to_utf<char>(localeStr,loc);
}

不幸的是,这段代码的反序无法处理服务器发送的字符串。

std::string toLocale(std::string utf8Str)
{
    boost::locale::generator g;
    g.locale_cache_enabled(true);
    std::locale loc = g(boost::locale::util::get_system_locale());
    return boost::locale::conv::from_utf<char>(utf8Str,loc);
}

共有2个答案

满元凯
2023-03-14

我找到的解决方案是使用RapidJson。

漆雕令秋
2023-03-14

JSON 规范允许 Unicode 字符的“\uXXXX”序列(其他 \X 转义序列)。如果您没有使用现有的JSON解析器来处理解码这些序列,则必须手动解码它们,例如:

// JSON uses Unicode, but is commonly encoded as UTF-8. However, Unicode
// characters that are encoded in "\uXXXX" format are expressed as UTF-16
// codeunit values, using surrogate pairs for codepoint values U+10000 and
// higher. This example uses C++11's std::u16string to handle UTF-16 parsing.
// If you are not using C++11 or later, you can replace it with std::wstring
// on platforms where wchar_t is 16bit, for instance.  If you want to handle
// the JSON using std::string/UTF-8 instead, you will have to tweak this
// parsing accordingly...

std::u16string str = ...; // JSON quoted-string value, eg: "Test \u00e9\u00e9\u00e9"...
std::u16string::size_type idx = 0;
do
{
    idx = str.find(u'\\', idx);
    if (idx == std::u16string::npos) break;

    std::u16string replaceStr;
    std::u16string::size_type len = 2;

    char16_t ch = str.at(idx+1);
    switch (ch)
    {
        case u'\"':
        case u'\\':
        case u'/':
            replaceStr = ch;
            break;

        case u'b':
            replaceStr = u'\b';
            break;

        case u'f':
            replaceStr = u'\f';
            break;

        case u'n':
            replaceStr = u'\n';
            break;

        case u'r':
            replaceStr = u'\r';
            break;

        case u't':
            replaceStr = u'\t';
            break;

        case u'u':
        {
            std::u16string hexStr = str.substr(idx+2, 4);
            len += hexStr.size();

            std::basic_istringstream<char16_t> iss(hexStr);
            unsigned short value;
            iss >> std::hex >> value;
            if (!iss)
            {
                // illegal value, do something
            }

            replaceStr = (char_t) value;
            break;
        }

        default:
            // illegal sequence, do something
            break;
    }

    str.replace(idx, len, replaceStr);
    idx += replaceStr.size();
}
while (true);
 类似资料:
  • 我正在尝试从最多500个字符的TextArea中获取值。但我面临一个问题,字符与变音符,其中每个特殊字符替换为4个字符。因此,如果我给出包含法语字符的500个字符的文本,在数据库中持久化所需的实际长度(字段长度为500)将超过500个字符,事务将失败。 一些例子: oubliée被转换为oubli:afetraye©E Désiriez被转换为D:FARTH©Siriez 使用的应用程序服务器:W

  • 本文向大家介绍js 中文汉字转Unicode、Unicode转中文汉字、ASCII转换Unicode、Unicode转换ASCII、中文转换&#XXX函数代码,包括了js 中文汉字转Unicode、Unicode转中文汉字、ASCII转换Unicode、Unicode转换ASCII、中文转换&#XXX函数代码的使用技巧和注意事项,需要的朋友参考一下 最近看不少在线工具里面都有一些编码转换的代码,很

  • 问题内容: 我无法在不丢失数据的情况下将以下Unicode转换为ASCII: 我尝试了,他们不会这样做。 有人有建议吗? 问题答案: Unicode字符,并且没有任何对应的ASCII值。因此,如果您不想丢失数据,则必须以某种有效的ASCII方式对数据进行编码。选项包括: 所有这些都是ASCII字符串,并且包含来自原始Unicode字符串的所有信息(因此可以将它们全部逆转而不会丢失数据),但是对于最

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

  • 问题内容: 我能够从发送消息到上。如果我从发送消息,则使用任何可访问性(包括完整的语言本地化)都没有区别;英语也没有问题。正确的编码很重要,只有以下代码行: 不幸的是,这是无效的。我要从中获取消息的情况有所不同。 在我得到消息的情况下,从Windows操作系统(英语,没有任何语言包),我能够把消息来自于形式。 如果Windows操作系统使用某些语言包进行了完全本地化,则我将收到一个例外 消息缓冲区

  • 问题内容: 我从HTML页面中将一个字符串输入到Java HTTPServlet中。根据我的要求,我得到了显示汉字的ASCII码: “&#21487;&#20197;&#21578;&#35785;&#25105;” (无空格) 如何将该字符串转换为Unicode? HTML代码: Java代码: 如果我打印问题[0],则会得到以下值:“&#21487;&#20197;&#21578;&#3578