在 C++ 中解释转义的 unicode 字符

Posted

技术标签:

【中文标题】在 C++ 中解释转义的 unicode 字符【英文标题】:Interpreting escaped unicode chars in C++ 【发布时间】:2014-03-31 14:07:45 【问题描述】:

假设我有一个名为 test.txt 的文件,其中包含以下文本:

\u003cdiv style=\"text-align: left;\" trbidi=\"on\"\u003e\nAppending is not creating

如果我想通过char 阅读char,它是这样的:

代码1:从文件中读取

ifstream file;
file.open("test.txt");
string line;
while (getline(file, line))
    cout << line<< endl; // prints \u003cdiv style=\"text-align: left;\" trbidi=\"on\"\u003e\nAppending is not creating

但是,如果我在代码中声明相同的字符串,则会检测并打印转义字符。

代码2:简单字符串

string line2 ("\u003cdiv style=\"text-align: left;\" trbidi=\"on\"\u003e\nAppending is 
cout << line2<< endl; // prints <div style="text-align: left;" trbidi="on">\n   Appending is not creating

这是完全正常的,因为\ 是 C++ 字符串的转义字符。

这提出了一个问题:是否有可能使用第一个代码获得相同的结果(即,将每一行解释为代码 2 中定义的字符串)?

【问题讨论】:

【参考方案1】:

STL 类string 没有执行此操作的任何函数。您必须实现自己的函数才能将转义字符表达式更改为正确的转义字符。这个函数看起来像这样:

string parse_escaped_characters(string s) 
    string s2;
    for (int i = 0; i < s.size(); ++i) 
        if (s[i] == '\\') 
            switch (s[i+1]) 
                case 'n': s2 += '\n'; ++i; break;
                case '\"': s2 += '\"'; ++i; break;
                //and so on...
            
        
        else s2 += s[i];
    
    return s2;
 

或者您可以搜索一个库来处理包含此功能的字符串。

【讨论】:

如果在您访问 s[i+1] 时最后一个字符是 '\\',则会失败 (UB)。 @bolov 好吧,根据规范,这不应该发生。当然,防范它而不是默默地失败会更好。 @KonradRudolph 根据标准,在 c++11 之前它是未定义的行为:operator[pos]pos == size() 用于 non-const string object @bolov 这不是我的意思。我的意思是最后一个字符 cannot'\',因为那将是一个无效的转义序列。它后面至少需要再跟一个字符。不过,该代码还有另一个错误:当解析转义序列时,它不会增加 i @KonradRudolph 哦,好的,我明白了。但是,我认为无论输入是否有效(就正确的转义字符而言),该功能都应该起作用。

以上是关于在 C++ 中解释转义的 unicode 字符的主要内容,如果未能解决你的问题,请参考以下文章

Unicode 转义序列

取消转义字符串中的 unicode

六位 unicode 转义值比较

python2模块中unicode中的转义控制字符

Unicode转义(uXXXX)的编码和解码

Unicode转义(uXXXX)的编码和解码