如何将std :: string写入UTF-8文本文件

poi*_*loi 57 c++ utf-8

我只想在C++中用文本文件写一些简单的行,但我希望它们用UTF-8编码.这样做的最简单方法是什么?

Ben*_*igt 55

UTF-8影响的唯一方法std::stringsize(),length(),和所有的索引在字节,而不是字符测量.

并且,正如sbi所指出的那样,递增迭代器std::string将逐字节而不是按字符前进,因此它实际上可以指向多字节UTF-8代码点的中间位置.标准库中没有提供UTF-8感知迭代器,但在'Net上有一些可用.

如果你还记得的话,你可以把UTF-8放进去std::string,把它写成文件等等都是通常的方式(我指的是你在std::string没有UTF-8 的情况下使用的方式).

您可能希望使用字节顺序标记启动文件,以便其他程序知道它是UTF-8.

  • 许多程序在读取UTF-8时会阻塞BOM,这会导致某些程序认为文本是UTF-16. (14认同)
  • BOM代码告诉您utf16或utf32流使用两种可能的字节顺序中的哪一种.它们对于utf8流甚至没有意义. (5认同)
  • 实际上[Unicode.org](http://www.unicode.org/faq/utf_bom.html)的确切引用是:**问:**无论底层处理器是否,UTF-8编码方案都是相同的是小端还是大端?**答:**是的.由于UTF-8被解释为字节序列,因此不存在字节序问题,因为存在使用16位或32位代码单元的编码形式.如果BOM与UTF-8一起使用,它仅用作编码签名来区分UTF-8与其他编码 - 它与字节顺序无关.*我认为这表示"表明它是UTF8编码"!* (3认同)
  • 为了完整性,将迭代器添加到第一个句子中,它与索引相同. (2认同)
  • 没错,但这是一种常见的,非常具体的支持不良的方式,如果遇到使用它的问题,值得了解. (2认同)

den*_*nys 24

有一个很好的小库可以使用来自c ++:utfcpp的 utf8

  • Uao那是最酷的图书馆.如果你知道UTF8是什么,你不需要任何其他东西. (2认同)

Bri*_*ndy 10

libiconv是一个很棒的库,可满足我们所有的编码和解码需求.

如果您使用的是Windows,则可以使用WideCharToMultiByte并指定您想要UTF8.


Jak*_*dle 10

这样做的最简单方法是什么?

在C++中最直观,最简单的utf8处理方式肯定是使用直接替换std::string.由于互联网仍然缺乏一个,我去自己实现功能:

tinyutf8(编辑:现在Github).

这个库提供了一个非常轻量级的插入式预置位std::string(或者std::u32string如果你愿意的话,因为你迭代代码点而不是char).Ity在快速访问和小内存消耗之间成功实现,同时非常强大.这种对"无效"UTF8序列的鲁棒性使其(几乎完全)与ANSI(0-255)兼容.

希望这可以帮助!

  • GPL意味着,如果我在你的程序中包含你的标题,我也必须制作我的程序GPL.相当不限你不觉得吗?我会推荐像这样的小型库的BSD样式许可证. (2认同)

Ton*_*ony 7

如果"简单"是指ASCII,则不需要进行任何编码,因为ASCII值为127或更小的字符在UTF-8中是相同的.


Ser*_*nil 5

std::wstring text = L"??????";
QString qstr = QString::fromStdWString(text);
QByteArray byteArray(qstr.toUtf8());    
std::string str_std( byteArray.constData(), byteArray.length());
Run Code Online (Sandbox Code Playgroud)