迭代通过C++中的UTF-8字符串11
问题描述:
我想遍历一个UTF-8字符串。这个问题据我了解,UTF-8字符的长度是可变的,所以我不能只是迭代字符,但我必须使用某种转换。我相信在现代C++中有这样的功能,但我不知道它是什么。迭代通过C++中的UTF-8字符串11
#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
不宜使用。
答
至于中午。建议我用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;
}
}
也许我应该更明确地说,我想知道,如果这是可以做到在C++ 11不使用任何第三方库像ICU的问题指定或UTF8-CPP。
没有“UTF-8字符”这样的东西。在你熟悉这个主题之前,跳到编写代码是令人沮丧和不合时宜的。 – 2014-09-27 11:21:27
你在一些Unixoid或Windows上?你想要密码单元,密码或字母吗? (字符是可笑的上下文依赖(并且甚至上下文可能不足以决定),并且在Windows上有额外的伤害) – Deduplicator 2014-09-27 11:21:37
你可能想看看[这里](http://en.cppreference.com/W/CPP /区域/ wstring_convert/from_bytes)。记住它在gcc中不起作用,他们还没有实现这部分标准,但是在clang/libC++中工作,并且应该与VS2013 IIRC一起工作。 – 2014-09-27 11:38:40