2

我读过在某些环境中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的 for 文件中,它只是返回一个错误,从而阻止读取更多的流。我本以为将错误更改为 Unicode "Invalid char" 0xfffd 值是一个更好的选择。

我的问题不限于UTF-8,无效UTF-16代理对如何?

让我们举个例子。假设您打开一个UTF-8带有UTF-8to的编码文件wchar_t locale。您的实现如何处理无效UTF-8序列?或者,astd::wstring并将其打印到std::cout,这次使用一个单独的代理。

4

3 回答 3

4

我已经读到在某些环境中 std::string 内部使用使用 UTF-8。

C++ 程序可以选择用于std::string在任何符合标准的平台上保存 UTF-8 字符串。

而在我的平台 Windows 上,std::string 只是 ASCII。

这是不正确的。在 Windows 上,您可以根据需要使用 astd::string来保存 UTF-8 字符串,std::string不限于在任何符合标准的平台上保存 ASCII。

可以使用 std::locale 更改此行为。

不, 的行为std::string不受语言环境库的影响。

Astd::string是一个序列chars。在包括 Windows 在内的大多数平台上,achar是 8 位的。因此,您可以使用std::stringASCII、Latin1、UTF-8 或任何使用 8 位或更少代码单元的字符编码。 std::string::length返回如此持有的代码单元的数量,并且std::string::operator[]将返回第 i 个代码单元。

对于保存 UTF-16,您可以使用char16_tstd::u16string

对于保存 UTF-32,您可以使用char32_tstd::u32string

于 2013-07-22T15:59:12.410 回答
1

假设您使用 UTF-8 到 wchar_t 语言环境打开一个 UTF-8 编码文件。您的实现如何处理无效的 UTF-8 序列?

通常没有人会在其他平台上转换为wchar_t或其他宽字符类型,但可用于此的标准方面都表示读取错误,导致流停止工作,直到错误被清除。

于 2013-07-22T16:15:21.493 回答
0

std::string应该是编码不可知的:http ://en.cppreference.com/w/cpp/string/basic_string - 所以它不应该验证代码点/数据 - 你应该能够在其中存储任何二进制数据。

编码真正产生影响的唯一地方是计算字符串长度和逐个字符地迭代字符串 - 并且语言环境在这两种情况下都应该没有影响。

而且 -std::locale如果可以完全避免使用它可能不是一个好主意 - 它在所有平台或标准库的所有实现上都不是线程安全的,因此在使用它时必须小心。这样做的效果也非常有限,而且可能根本不是你所期望的那样。

于 2013-07-22T15:14:21.817 回答