“警告:多字符字符常量[-Wmultichar]”并且程序不起作用

时间:2017-01-06 20:44:42

标签: c++ string unicode utf-8

所以,我正在编写将符文翻译成英文字母的程序 它给了我警告“警告:多字符字符常量[-Wmultichar]” 这是代码(不是来自程序,但它有同样的问题) 代码在c ++中

if(s.at(0) == 'ᛡ') cout<<"YES"; (一串两个utf-8字母,符文)

{{1}}

但是警告不是主要问题,问题是当我运行它时它不会输出“YES”,如果是程序,当我尝试将符文翻译成字母时它只是开始工作并制作束endl函数而不是翻译符文(基本上它什么都不做)

P.S我尝试使用不同的兼容者,在visual studio中出现错误,“Debug Assertion Failed!” “表达式:字符串下标超出范围” 其他的比较者什么都不做,我甚至尝试使用unicode而不是像“\ u16B3”这样的字符来构建程序....但是它是一样的,所以我该怎么办?我需要特定的utf-8库吗?请帮忙

1 个答案:

答案 0 :(得分:0)

如果你查看std::string中字符的表示,你会看到每个字符都使用多个字节 - 因此警告。在处理Unicode时,你需要使用32位的东西来表示单个代码点,或者你需要为每个代码点使用多个字节。代码点的使用可能足够,但依赖于不使用组合字符的字符。

比较Unicode字符串并非完全无关紧要(而且我不了解所有规则)。使用UTF-8表示数据时,您需要比较字节序列。此外,您需要确保Unicode字符串已规范化:某些字符串具有不同的有效表示形式。例如,我的名字中的u-umlaut可以用u-umlaut的代码点表示,或者用u代码点表示,并且可以用于表达dieresis的字符。在你的代码中,我猜你可以使用

std::string expect("ᛡ");
if (expect.size() <= s.size() && s.substr(0, expect.size()) == expect)
    std::cout << "YES\n";