2

GCC 的标准库或 Boost 或任何其他库是否实现兼容 iostream 的版本ifstreamofstream支持 UTF-8 编码(文件)流与 astd::vector<wchar_t>或之间的转换std::wstring

4

2 回答 2

4

C++11 解决方案是将 UTF-8 流包装在适当的wbuffer_convert

#include <fstream>
#include <string>
#include <codecvt>
int main()
{
    std::ifstream utf8file("test.txt"); // if the file holds UTF-8 data
    std::wbuffer_convert<std::codecvt_utf8<wchar_t>> conv(utf8file.rdbuf());
    std::wistream ucsbuf(&conv);
    std::wstring line;
    getline(ucsbuf, line); // then line holds UCS2 or UCS4, depending on the OS
}

这适用于 Visual Studio 2010 和 clang++/libc++,但不幸的是,不适用于 GCC。

在这变得普遍之前,第三方库确实是最好的解决方案。

于 2011-10-25T13:20:46.307 回答
2

你的问题不太行。UTF-8 是一种特定的编码,whilewchar_t是一种数据类型。而且,wchar_t标准的目的是表示系统的字符集,但这完全是由平台决定的,标准没有任何要求。

因此,正确的要求首先是系统的窄多字节编码和系统编码的定长编码到宽字符串之间的转换。此功能由std::mbstowcs和提供std::wcstombs。也可能在某个地方有一个语言环境方面来包装这个,但那是图书馆的一个小众区域。

如果要在标准规定的不透明“系统编码”和序列化数据源/接收器规定的明确编码之间进行转换,则需要一个额外的库。我推荐 Posix's iconv(),它广泛可用。(Windows API 有不同的方法,并提供特殊的转换函数。)

C++11 通过添加一个明确的 UTF 编码字符串类型和文字系列稍微缓解了这个问题,并且可能还包括其中的转码工具(尽管我从未见过任何人实现它们)。

这是我对过去有关该主题的帖子的标准回复:Q1Q2Q3。一旦完全可用,C++11 将是一种乐趣:-)

于 2011-10-25T12:15:47.007 回答