我读到在某些环境中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
,这次使用一个单独的代理。
我读到在一些环境中std::string内部使用UTF-8。
C++程序可以选择在任何符合标准的平台上使用std::string
来保存UTF-8字符串。
然而,在我的平台Windows上,std::string仅为ASCII。
这是不对的。在Windows上,如果需要,可以使用std::string
来保存UTF-8字符串,std::string
不限于在任何符合标准的平台上保存ASCII。
可以使用std::locale来更改此行为。
否,std::string
的行为不受区域设置库的影响。
CCD_ 24是CCD_。在包括Windows在内的大多数平台上,char
是8位的。因此,您可以使用std::string
来保存ASCII、Latin1、UTF-8或任何使用8位或更少代码单元的字符编码。std::string::length
返回保持的代码单元的数量,std::string::operator[]
将返回第i个代码单元。
对于持有UTF-16,您可以使用char16_t
和std::u16string
。
对于持有UTF-32,您可以使用char32_t
和std::u32string
。
假设您打开了一个使用UTF-8到wchar_t语言环境的UTF-8编码文件。您的实现如何处理无效的UTF-8序列?
通常,没有人会在其他平台上转换为wchar_t
或其他宽字符类型,但可用于此操作的标准方面都会发出读取错误的信号,导致流停止工作,直到错误被清除。
std::string
应该是编码不可知的:http://en.cppreference.com/w/cpp/string/basic_string-所以它不应该验证代码点/数据-你应该能够在其中存储任何二进制数据。
编码真正起作用的唯一地方是计算字符串长度和逐个字符迭代字符串——在这两种情况下,区域设置都不应该有任何影响。
而且-如果可以避免的话,使用std::locale
可能不是一个好主意-它在所有平台或标准库的所有实现上都不是线程安全的,所以在使用它时必须小心。这种效果也非常有限,可能根本不是你所期望的。