【问题标题】:How can I unescape a UTF-8 string in c++如何在 C++ 中取消转义 UTF-8 字符串
【发布时间】:2015-11-06 04:01:11
【问题描述】:

和我搜索过的很多案例都有些不同。

我收到如下字符串:

std::string str = "\\u8f93\\u5165\\u7684";

如何解析转义序列以构造实际的 UTF-8 字符串?

【问题讨论】:

  • 解码是什么意思?
  • 您可以遍历每个字符,如果它是一个反斜杠,后跟u,读取接下来的 4 个字符,使用std::strtol() 将它们解析为一个整数,并将其作为一个字符适当地附加到另一个字符-类型的字符串,例如std::basic_string<uint32_t>.
  • 这是两个问题:如何转义为 UTF-16,以及如何将其转换为 UTF-8。前者是一些平庸的bitwiggling(正如TPC指出的那样),对于后者(以及一般的Unicode处理)我建议ICU
  • @DevSolar 虽然 ICU 是一个很好的一般建议,但 UTF 到 UTF 的转换是 C++11 的一部分
  • @Cubbi:标准 C++ 在处理字符集的细节方面仍然相当差劲,这就是我建议不要打扰的原因。迟早你会和toupper( 'ß' )这样的东西发生冲突。

标签: c++ linux utf-8


【解决方案1】:

注意:此答案是在向问题添加澄清编辑之前发布的。


只需将其传递给“\u8f93\u5165\u7684”之类的字符串

或者:

#include <codecvt>
std::string(u8"\u8f93\u5165\u7684")

【讨论】:

  • 恐怕这并不能回答问题。据我了解,OP 有一个包含字面意思“\u8f93\u5165\u7684”的字符串,并且想要解析转义序列以构造一个实际的 UTF-8 字符串。
  • @Quentin 的理解是对的。我收到了一个定义的字符串,就像我上面提到的那样。问题是如何从中获取实际的 UTF-8 字符串。
  • @ericxluo 您要查找的词是“unes​​cape”。
【解决方案2】:

这是一个简单的解析和转换工作,例如可以这样完成:

#include <iostream>
#include <string>
#include <codecvt>
#include <boost/spirit/include/qi.hpp>
namespace qi = boost::spirit::qi;
int main()
{
    std::string str = "\\u8f93\\u5165\\u7684";
    std::u16string u16;
    qi::parse(str.begin(), str.end(), *("\\u" >> qi::hex), u16);
    std::string u8 = std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t>().to_bytes(u16);
    std::cout << "utf 8 string " << u8 << " consiting of " << u8.size() << " bytes\n";
}

住在科里鲁http://coliru.stacked-crooked.com/a/62efb680a3d27a60

【讨论】:

    猜你喜欢
    • 2016-10-01
    • 2011-11-14
    • 1970-01-01
    • 2012-12-13
    • 2011-09-06
    • 2014-02-22
    • 2014-07-11
    • 1970-01-01
    • 2017-03-04
    相关资源
    最近更新 更多