我正在尝试迭代UTF-8字符串。我理解的问题是UTF-8字符具有可变长度,所以我不能只迭代char-by-char但我必须使用某种转换。我确信在现代C ++中有一个功能,但我不知道它是什么。
#include <iostream>
#include <string>
int main()
{
std::string text = u8"řabcdě";
std::cout << text << std::endl; // Prints fine
std::cout << "First letter is: " << text.at(0) << text.at(1) << std::endl; // Again fine. So 'ř' is a 2 byte letter?
for(auto it = text.begin(); it < text.end(); it++)
{
// Obviously wrong. Outputs only ascii part of the text (a, b, c, d) correctly
std::cout << "Iterating: " << *it << std::endl;
}
}
使用clang++ -std=c++11 -stdlib=libc++ test.cpp
从我读过的内容wchar_t
和wstring
不应该使用。
答案 0 :(得分:3)
早上好建议我使用std::wstring_convert
:
#include <codecvt>
#include <locale>
#include <iostream>
#include <string>
int main()
{
std::u32string input = U"řabcdě";
std::wstring_convert<std::codecvt_utf8<char32_t>, char32_t> converter;
for(char32_t c : input)
{
std::cout << converter.to_bytes(c) << std::endl;
}
}
在没有使用任何第三方库(如ICU或UTF8-CPP)的情况下,如果可以在C ++ 11中做到这一点,或许我应该更清楚地指出我想知道的问题。