首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >XML头中的“编码”有什么用?

XML头中的“编码”有什么用?
EN

Stack Overflow用户
提问于 2011-03-02 09:05:07
回答 4查看 28.7K关注 0票数 47

查看XML头

代码语言:javascript
运行
复制
<?xml version="1.0" encoding="UTF-16" standalone="no"?>

我是否正确地声明encoding属性是

  • 太迟了(除非你知道编码,否则你无法正确地读懂它.)
  • 冗余,因此容易出错:用"Big5“替换它太容易了,但是将文件保存在UTF-8中

或者,该属性是否与流的内容无关?

我把事情搞混了吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-03-02 09:14:29

正如您所提到的,您必须知道文件的编码才能读取encoding属性。

但是,有一种启发式方法可以很容易地使您接近“真实”编码,从而允许您读取编码属性。这是可行的,因为根据定义,<?xml部件只能包含ASCII范围中的字符(尽管它们是编码的)。

XML标准甚至是描述用于查找编码的确切过程。

编码标签也不是多余的。例如,如果您使用XML规范中的算法来发现使用了一些基于ASCII的(或与ASCII兼容的)编码,则仍然需要读取编码以确定实际使用的编码(有效的候选是ASCII、UTF-8、任何编码、任何*编码、KOI8-R和许多其他编码)。对于<?xml部分本身来说,它不会改变它是哪个部分,但是对于文档的其余部分,它会产生巨大的不同。

关于错误标记的XML文件:是的,很容易生成这些文件,但是:XML规范明确规定这些文件是不正常的,因此是不正确的。不正确的编码必须报告为错误(只要可以检测到!)。因此,这是生成XML的人的问题。

票数 43
EN

Stack Overflow用户

发布于 2011-03-02 11:57:01

你说得对,这看起来像个奇怪的设计。它只起作用,因为XML声明只使用ASCII字符,而且几乎所有编码都是ASCII的超集。如果您准备接受一些不是的东西,例如EBCDIC,您可以检查文件是否以"<?xml"的EBCDIC表示形式开头。这意味着您所依赖的是文件头中的一般冗余级别,而不是纯粹的编码属性本身。与XML中的许多东西一样,它很实用,也很有效,但并不特别优雅。

票数 6
EN

Stack Overflow用户

发布于 2011-03-02 09:08:24

XML解析器只需要支持至少UTF-8和UTF-16。XML解析器首先尝试基于Byte Order Mark (BOM)的编码,如果存在的话(对于UTF-16,UTF-32,甚至UTF-8和虚拟BOM)。如果没有找到,则解析器将尝试UTF-32、UTF-16、UTF-8、ASCII和其他与ASCII兼容的单字节编码。只有这样,它才会看到编码属性,并在必要时重新启动解析。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5165347

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档