Utf 8 如果这种转换永远都不可能正确,为什么微软会采用它呢?

Utf 8 如果这种转换永远都不可能正确,为什么微软会采用它呢?,utf-8,visual-studio-2015,byte-order-mark,Utf 8,Visual Studio 2015,Byte Order Mark,下图对应于Jim Springfield在本表1252号下方突出显示的I女士的表1。我意识到,假设codepage 1252是用于创建文件的源字符集的决定是在文章的前一页中给出的,带有以下文本(我的重点): 如果没有BOM,并且看起来不像UTF-16,那么我们使用 当前代码页(调用GetACP的结果),以转换上的字节 将磁盘插入UTF-8。这可能正确,也可能不正确,这取决于 文件实际上是编码的,它包含哪些字符如果文件 实际上编码为UTF-8,这将永远不会正确 无法将代码页设置为CP\U UTF8

下图对应于Jim Springfield在本表1252号下方突出显示的I女士的表1。我意识到,假设codepage 1252是用于创建文件的源字符集的决定是在文章的前一页中给出的,带有以下文本(我的重点):

如果没有BOM,并且看起来不像UTF-16,那么我们使用 当前代码页(调用GetACP的结果),以转换上的字节 将磁盘插入UTF-8。这可能正确,也可能不正确,这取决于 文件实际上是编码的,它包含哪些字符如果文件 实际上编码为UTF-8,这将永远不会正确 无法将代码页设置为CP\U UTF8

如果这种转换永远都不可能正确(至少对于UTF-8的情况),为什么MS会采用这种转换?这背后的理性是什么

基本上,为什么他们不能在这种情况下使用
UTF8->UTF8
转换

我可以用这个片段来确认上面显示的事实,在这个片段中,文件是用这个特殊选项保存的:
Unicode(不带签名的UTF-8)代码页65001

#include <iostream>
int main()
{
    char c[] = u8"屰";
    int i = 1;
}
#包括
int main()
{
字符c[]=u8“屰";
int i=1;
}
同时,通过二进制编辑器查看文件内容,我可以看到组成字符
,0xE5 0xB1 0xE0,这是汉字的正确UTF-8编码。同时查看数组
c[]
占用的内存,我发现字节0xC3 0xA5 0xC2 0xB1 0xC2 0xB0 0x00,它与表1中提到的列的最后一行完全对应


因为它非常有意义。如果没有BOM表,您永远无法知道文件是否为UTF8。它可能包含拉丁字符直到最后一行,然后包含一些UTF8编码的字符。但是,如果不先加载所有内容,您就无法知道这一点。您只能猜测,并且使用当前系统区域设置是一个很好的猜测ny.BTW如果你知道它是UTF8,你就不需要转换任何东西。只需在你的文件中添加一个BOM表,或者在你知道是UTF8的无BOM文件中添加一个BOM表。或者在你的代码中将数据视为UTF8。那么为什么他们可以像我在上面的代码片段中所做的那样使用
UTF-8 w/o BOM
保存文件?PS:当前的代码页实际上就是系统m的区域设置。在“区域设置”的“管理”选项卡中,这被描述为“非Unicode程序的语言”,他们在
Do's/Don'ts
中对此进行了解释。一些工具会因BOM而阻塞。这是解决方法,而不是默认方法。