XML的默认编码是UTF-8还是UTF-16?

Pac*_*ier 17 xml xml-serialization

OpenTag FAQ说明:

如果XML文档中不存在编码声明(并且没有可用的外部编码声明机制,例如HTTP标头),则XML文档的假定编码取决于字节顺序标记(BOM)的存在.

BOM是位于文件顶部的Unicode特殊标记,用于指示其编码.BOM对于UTF-8是可选的.

First bytes        Encoding assumed
-----------------------------------------
EF BB BF           UTF-8
FE FF              UTF-16 (big-endian)
FF FE              UTF-16 (little-endian)
00 00 FE FF        UTF-32 (big-endian)
FF FE 00 00        UTF-32 (little-endian)
None of the above  UTF-8
Run Code Online (Sandbox Code Playgroud)

对上段是否有一个愚蠢的解释?

wim*_*ica 29

要么你必须使用像这样的行

<?xml version="1.0" encoding="iso-8859-1" ?>
Run Code Online (Sandbox Code Playgroud)

指定使用哪种编码.如果未指定编码,则可以存在字节顺序标记(BOM).如果存在UTF-16或UTF-32的BOM,则使用该编码.否则UTF-8是编码.(UTF-8的BOM是可选的)

编辑

BOM是一个不可见的字符.但没有必要看到它.应用程序会自动处理它.使用Windows记事本时,可以在保存文件时选择编码.记事本将自动在文件的开头插入BOM.当您稍后重新打开文件时,记事本将识别BOM并使用正确的编码来读取文件.您无需修改​​BOM,如果您这样做,字符可能会有不同的含义,因此文本将不同.

我将尝试用一个例子来解释.考虑一个文本文件,只有字符"test".默认记事本将使用ANSI编码,当您以十六进制模式查看时,文本文件将如下所示:

C:\>C:\gnuwin32\bin\hexdump -C test-ansi.txt
00000000  74 65 73 74                                       |test|
00000004
Run Code Online (Sandbox Code Playgroud)

(如你所见,我正在使用gnuwin32中的hexdump,但你也可以使用像Frhed这样的十六进制编辑器来看这个.

此文件前面没有BOM.这是不可能的,因为用于BOM的字符在ANSI编码中不存在.(因为没有BOM,不支持ANSI编码的编辑器会将此文件视为UTF-8).

当我现在像utf8一样保存文件时,你会在"test"前面看到3个额外的字节(BOM):

C:\>C:\gnuwin32\bin\hexdump -C test-utf8.txt
00000000  ef bb bf 74 65 73 74                              |test|
00000007
Run Code Online (Sandbox Code Playgroud)

(如果您使用不支持utf-8的文本编辑器打开此文件,您实际上会看到这些字符"")

记事本也可以将文件保存为unicode,这意味着UTF-16 little-endian(UTF-16LE):

C:\>C:\gnuwin32\bin\hexdump -C test-unicode.txt
00000000  ff fe 74 00 65 00 73 00  74 00                    |ÿþt.e.s.t.|
0000000a
Run Code Online (Sandbox Code Playgroud)

这里的版本保存为unicode(大端)(UTF-16BE):

C:\>C:\gnuwin32\bin\hexdump -C test-unicode-big-endian.txt
00000000  fe ff 00 74 00 65 00 73  00 74                    |þÿ.t.e.s.t|
0000000a
Run Code Online (Sandbox Code Playgroud)

现在考虑一个带有4个汉字"琀攀猀琀"的文本文件.当我将其保存为unicode(大端)时,结果如下所示:

C:\>C:\gnuwin32\bin\hexdump -C test2-unicode-big-endian.txt
00000000  fe ff 74 00 65 00 73 00  74 00                    |þÿt.e.s.t.|
0000000a
Run Code Online (Sandbox Code Playgroud)

如您所见,UTF-16LE中的"test"一词的存储方式与UTF-16BE中的"琀攀猀word"相同.但由于BOM存储不同,您可以查看该文件是否包含"test"或"琀攀猀琀".如果没有BOM,您将不得不猜测.