迭代通过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_twstring不宜使用。

+0

没有“UTF-8字符”这样的东西。在你熟悉这个主题之前,跳到编写代码是令人沮丧和不合时宜的。 – 2014-09-27 11:21:27

+0

你在一些Unixoid或Windows上?你想要密码单元,密码或字母吗? (字符是可笑的上下文依赖(并且甚至上下文可能不足以决定),并且在Windows上有额外的伤害) – Deduplicator 2014-09-27 11:21:37

+1

你可能想看看[这里](http://en.cppreference.com/W/CPP /区域/ wstring_convert/from_bytes)。记住它在gcc中不起作用,他们还没有实现这部分标准,但是在clang/libC++中工作,并且应该与VS2013 IIRC一起工作。 – 2014-09-27 11:38:40

至于中午。建议我用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。

+0

你使用什么版本的g ++?它可能是C++的一部分14 – Splash 2015-11-09 03:24:11

+0

我使用clang:Apple LLVM版本7.0.0(clang-700.0.72),但这都是C++ 11。你可以查看http://en.cppreference.com – 2015-11-09 06:19:11

+0

我在http://en.cppreference.com/w/cpp/locale/codecvt_utf8上运行,选择了4.9版本的C++ 11,编译。你可以看一下吗? – Splash 2015-11-09 17:27:37