你必须使用类似以下的一行代码:
<?xml version="1.0" encoding="iso-8859-1" ?>
为了指定使用哪种编码,如果未指定编码,则可以存在
字节顺序标记(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
(正如您所看到的,我正在使用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
如果您使用不支持UTF-8的文本编辑器打开此文件,您实际上会看到这些字符""。
Notepad也可以将文件保存为Unicode,这意味着UTF-16小端(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
以下是以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
现在考虑一个包含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
正如你所看到的,在UTF-16LE编码中,“test”这个单词的存储方式与UTF-16BE编码中“琀攀猀琀”这个单词的存储方式相同。但是由于字节序标记(BOM)的不同,你可以确定文件是否包含“test”或“琀攀猀琀”。如果没有BOM,你就必须猜测。