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序列是如何产生的