C++ 具有默认utf8处理的流
我已经读到,在某些环境中,C++ 具有默认utf8处理的流,c++,unicode,c++11,stream,locale,C++,Unicode,C++11,Stream,Locale,我已经读到,在某些环境中,std::string内部使用UTF-8。然而,在我的平台上,Windows,std::string仅为ASCII码。使用std::locale可以更改此行为。我的STL版本没有,或者至少我找不到用于字符串的UTF-8方面。但是,我有一个方面可用于fstream类集 编辑: 当我说“在内部使用UTF-8”时,我指的是像std::basic\u filebuf::open(),在某些环境中接受UTF-8编码字符串。我知道这不是一个真正的std::string问题,而是一些
std::string
内部使用UTF-8。然而,在我的平台上,Windows,std::string
仅为ASCII码。使用std::locale
可以更改此行为。我的STL版本没有,或者至少我找不到用于字符串的UTF-8方面。但是,我有一个方面可用于fstream
类集
编辑:
当我说“在内部使用UTF-8”时,我指的是像std::basic\u filebuf::open()
,在某些环境中接受UTF-8
编码字符串。我知道这不是一个真正的std::string
问题,而是一些操作系统在本地使用UTF-8
。我的问题应该理解为“您的实现如何处理无效序列的代码转换?”
这些流如何处理其他平台/实现上的无效代码序列
在我的文件UTF8
facet
中,它只是返回一个错误,这反过来会阻止读取更多的流。我认为将错误更改为Unicode“Invalid char”0xfffd值是更好的选择
我的问题不限于UTF-8
,无效的UTF-16
代理项对如何
让我们举个例子。假设您使用UTF-8
打开一个UTF-8
编码文件以wchar\u t
locale
。您的实现如何处理无效的UTF-8
序列?
或者,一个
std::wstring
并将其打印到std::cout
,这次使用一个单独的代理。std::string
应该是编码不可知的:-因此它不应该验证代码点/数据-您应该能够在其中存储任何二进制数据
编码真正起作用的唯一地方是计算字符串长度和逐个字符地迭代字符串,而语言环境在这两种情况下都不应产生任何影响
此外,如果可以避免的话,使用
std::locale
可能不是一个好主意,因为它在所有平台或标准库的所有实现上都不是线程安全的,所以在使用它时必须小心。这样做的效果也非常有限,可能根本不是您所期望的。std::string
应该是编码不可知的:-因此它不应该验证代码点/数据-您应该能够在其中存储任何二进制数据
编码真正起作用的唯一地方是计算字符串长度和逐个字符地迭代字符串,而语言环境在这两种情况下都不应产生任何影响
此外,如果可以避免的话,使用std::locale
可能不是一个好主意,因为它在所有平台或标准库的所有实现上都不是线程安全的,所以在使用它时必须小心。这样做的效果也非常有限,可能根本不是你所期望的
我已经读到,在某些环境中,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
的行为不受区域设置库的影响
std::string
是一个字符序列
。在包括Windows在内的大多数平台上,char
是8位的。因此,您可以使用std::string
来保存ASCII、拉丁文1、UTF-8或任何使用8位或更少代码单元的字符编码std::string::length
返回这样保存的代码单位数,而std::string::operator[]
将返回第i个代码单位
要保持UTF-16,可以使用char16\u t
和std::u16string
要保持UTF-32,可以使用char32\u t
和std::u32string
我已经读到,在某些环境中,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
的行为不受区域设置库的影响
std::string
是一个字符序列
。在包括Windows在内的大多数平台上,char
是8位的。因此,您可以使用std::string
来保存ASCII、拉丁文1、UTF-8或任何使用8位或更少代码单元的字符编码std::string::length
返回这样保存的代码单位数,而std::string::operator[]
将返回第i个代码单位
要保持UTF-16,可以使用char16\u t
和std::u16string
要保持UTF-32,可以使用char32\u t
和std::u32string
假设您打开了一个UTF-8编码的文件,其语言环境为UTF-8到wchar\u t。您的实现如何处理无效的UTF-8序列
通常,没有人会在其他平台上费心转换为wchar\u t
或其他宽字符类型,但可用于此操作的标准面都会发出读取错误信号,导致流停止工作,直到错误被清除
假设您打开了一个UTF-8编码的文件,其语言环境为UTF-8到wchar\u t。无效的UTF-8序列是如何产生的