【发布时间】:2013-07-21 09:24:36
【问题描述】:
我读到在某些环境中std::string 内部使用 UTF-8。而在我的平台 Windows 上,std::string 仅是 ASCII。可以使用std::locale 更改此行为。我的 STL 版本没有,或者至少我找不到,用于字符串的 UTF-8 方面。不过,我确实有一个方面可用于 fstream 类集。
编辑:
当我说“在内部使用 UTF-8”时,我指的是像 std::basic_filebuf::open() 这样的方法,在某些环境中它接受 UTF-8 编码的字符串。我知道这并不是真正的std::string 问题,而是某些操作系统本身使用UTF-8。我的问题应该理解为“您的实现如何处理无效序列的代码转换?”。
这些流如何处理其他平台/实现上的无效代码序列?
在我的 UTF8 facet 文件中,它只是返回一个错误,从而阻止读取更多的流。我本以为将错误更改为 Unicode "Invalid char" 0xfffd 值是一个更好的选择。
我的问题不仅限于UTF-8,那么无效的UTF-16 代理对呢?
让我们举个例子。假设您打开一个UTF-8 编码文件,其中UTF-8 到wchar_t locale。您的实现如何处理无效的UTF-8 序列?
或者,std::wstring 并将其打印到 std::cout,这一次使用一个单独的代理。
【问题讨论】:
-
这取决于用例。有时您希望发出错误信号(当无效数据完全不可接受时);有时你想要 U+FFFD;有时你想简单地丢弃坏数据;有时你想要别的东西。
-
@R.MartinhoFernandes 你的实现是否至少让你可以选择告诉它如何处理这种情况?
-
在您的示例中-请您给出确切的编解码器方面吗?是:
std::codecvt_utf8<wchar_t>? - 你使用的是什么确切的流?std::wifstream?您打算使用什么确切的字符串类型?std::wstring或std::string? -
@IwanAucamp 我没有针对这些方面的 C++11 扩展。虽然我确实有一个仅用于文件流的
std::codecvt< char32_t, char, mbstate_t >方面。 -
@Waldermort 你用的是哪个?
标签: c++ unicode c++11 stream locale