我一直在努力解决这个问题很长一段时间,这是我第一次基本上处理unicode或UTF-8。
这就是我想要做的,我只想迭代一个std :: string,其中包含来自普通字母和unicode符号的组合,在我的例子中是短划线“ - ”。更多信息:http://www.fileformat.info/info/unicode/char/2013/index.htm
这是我尝试过的代码,它不会运行:
#include <iostream>
#include <string>
int main()
{
std::string str = "test string with symbol – and !";
for (auto &letter : str) {
if (letter == "–") {
std::cout << "found!" << std::endl;
}
}
return 0;
}
这是我的编译器的结果:
main.cpp: In function 'int main()':
main.cpp:18:23: error: ISO C++ forbids comparison between pointer and
integer [-fpermissive]
if (letter == "–") {
^
另外,当我浏览互联网时,我发现了一个有趣的信息,我需要解决这类任务。 How to search a non-ASCII character in a c++ string?
但是当我尝试使用那些UTF-8十六进制代码修改我的代码时,它也不会运行:
if (letter == "\xE2\x80\x93") {
std::cout << "found!" << std::endl;
}
与我的编译器完全相同的消息,这是c ++禁止指针和整数之间的比较。
我错过了什么吗?或者我是否需要使用ICU或Boost等库? 非常感谢您的帮助。谢谢!
更新
根据UnholySheep的回答,我一直在改进我的代码,但它仍然无法正常工作。它可以通过编译,但当我试图运行它,它不能输出“发现!”出去那么,我该如何解决这个问题呢?谢谢。
答案 0 :(得分:2)
这段代码怎么样?
#include <iostream>
#include <string>
int main()
{
std::wstring str = L"test string with symbol – and !";
for (auto &letter : str) {
if (letter == L'–') {
std::cout << "found!" << std::endl;
}
}
return 0;
}
答案 1 :(得分:1)
正如UnholySheep在评论中所说,char文字"–"
是一个char数组。假设utf8表示,char em_dash = "–";
与char em_dash = {'\xe2', '\x80', '\x93'};
相同。
您只能使用当前代码找到真实字符。例如,这将正常工作:
...
if (letter == '!')
...
因为'!'
是一个char常量。
如果你只想处理基本多语言平面中的unicode字符(代码低于0xFFFF),那么使用宽字符应该足够像@ ArashMohammadi的回答中提出的那样。对于像emoji chars这样的BMP之外的字符的替代解决方案是使用std::u32string
,其中每个unicode字符由单个char32_t
字符表示。
如果要直接处理UTF8编码的单字节字符串,则必须使用compare
方法:
std::string em_dash = "–"; // or "\xe2\x80\x93"
...
for (size_t pos=0; pos <= str.size() - em_dash.size(); pos++) {
if (str.compare(pos, em_dash.size(), em_dash()) == 0) {
std::cout << "found!" << std::endl;
}
}
...
或直接使用find
方法:
...
if (str.find(em_dash) != str.npos) {
std::cout << "found!" << std::endl;
}
...