在C ++ 11中迭代UTF-8字符串

时间:2014-09-27 11:19:47

标签: c++11 unicode utf-8

我正在尝试迭代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_twstring不应该使用。

1 个答案:

答案 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中做到这一点,或许我应该更清楚地指出我想知道的问题。