我不希望 xml writer 对多语言字符进行编码,这怎么可能?
实际上,当您编写 XML 时,您就已经进行了编码。您的意思是您不想对这两个字符使用数字实体,这是可能的,但并非总是如此。
要不使用数字实体,您需要将文档的编码与字符串的编码相匹配。从您提供的输出中我只能猜测一点,这两个字符可能代表:
- Unicode 汉字 '中国人民,汉语' (U+6F22)
- Unicode 汉字 '字母、字符、单词' (U+5B57)
这可能意味着(到目前为止我不会说任何中文)中文字.
PHP 中的 XMLWriter 总是将字符放入数字实体中(例如漢
and 字
在您的示例中)每当文档的编码无法表示文档中的该字符时。
如果您能够匹配两种编码,XMLWriter 将自动不使用数字实体。
我举一个更简单的例子。让我们以US-ASCII
编码和德语变音Ä
from Äpfel (符号库 > Unicode字符库 > Unicode区段:拉丁语大写字母 A 与分音符号 > (U+00C4)) 作为属性值:
<?php
$xmlWriter = new XMLWriter();
$xmlWriter->openMemory();
$xmlWriter->startDocument('1.0', 'US-ASCII');
$xmlWriter->startElement('root');
$xmlWriter->writeAttribute('value', 'Äpfel');
$xmlWriter->endDocument();
echo $xmlWriter->flush();
在 UTF-8 编码的 PHP 文件中编写的这段代码在执行时将输出:
<?xml version="1.0" encoding="US-ASCII"?>
<root value="Äpfel"/>
Ä
是 unicode 字符 U+00C4 的数字实体,如果仔细观察,C4 是十进制 196 的十六进制表示形式,这也表明数字 XML 实体始终表示 Unicode 字符编号。
因此 XML 输出使用 US-ASCII 编码,该编码无法表示Ä
来自 PHP 代码中的 UTF-8 编码字符串,因此使用其数字实体对其进行正确编码以保留字符信息。
现在更改编码:
$xmlWriter->startDocument('1.0', 'US-ASCII');
PHP 字符串的 UTF-8 编码:
$xmlWriter->startDocument('1.0', 'UTF-8');
确实改变了这个输出:
<?xml version="1.0" encoding="UTF-8"?>
<root value="Äpfel"/>
这同样适用于您的示例,但是,您的问题中缺少一个重要信息:该记录中的字符串采用哪种编码?
如果它已经是 UTF-8,那么就像我在上面的示例中概述的那样,它已经可以工作了:
<?php
$recordUTf8 = "... contents=\"Just <span style=\"color:red\">testing</span>:"
."\xE6\xBC\xA2\xE5\xAD\x97\"";
$encoding = 'UTF-8';
$encoding = 'US-ASCII';
$xmlWriter = new XMLWriter();
$xmlWriter->openMemory();
$xmlWriter->startDocument('1.0', $encoding);
$xmlWriter->startElement('record');
$xmlWriter->writeAttribute('value', $recordUTf8);
$xmlWriter->endDocument();
echo $xmlWriter->flush();
Output:
<?xml version="1.0" encoding="UTF-8"?>
<record value="... contents="Just <span style="color:red">
testing </span>:漢字 ""/>
正如此输出所示,此处没有使用数字实体,但是,该字符串显然是 UTF-8 编码的(此处以二进制安全方式进行编码,以防在复制 PHP 文件时对 PHP 文件使用不同的编码)。
总结一下:XML 编码需要与字符串的编码相匹配,以表示所有不在数字实体中的字符(除了用于对 XML 本身进行编码的字符之外,例如<
, >
, '
, "
and &
).
这些几乎都是 XML 基础知识。如果文档具有无法表示字符数据的编码,但由于 XML 支持 Unicode,则后备是数字实体。您试图通过将文档编码与字符串编码对齐来防止这种回退。
这是我对 PHP 和 XMLWriter 的具体建议:
- 从数据库中获取记录或将记录重新编码为 UTF-8。
- 仅将 UTF-8 字符串传递给
XMLWriter
方法。
- 将 XML 文档编码设置为 UTF-8。
我给出这些建议是因为 UTF-8 是 XML 的默认编码,并且 PHP 中对 UTF-8 的支持相当好。此外,XMLWriter 期望 Unicode 字符串采用 UTF-8 编码,没有任何设置或选项允许您更改它,因此输入已经需要采用 UTF-8 编码。
无论输入字符串如何独立,您自然可以告诉 XMLWriter 使用不同的输出编码。例如,任何其他中文或 Unicode 编码可能适合您,并且只要您的 PHP 配置支持该特定输出编码(检查 iconv 库你有)。
当您使用 XMLWriter 启动文档时,第二个参数指定编码:
$xmlWriter->startDocument('1.0', $encoding);
您可以在相应的 XML 声明中放入 XML 支持的编码集中的任何编码:
<?xml version="1.0" encoding="ISO-8859-1"?><!-- Latin-1 example -->
XML 编码值的完整规范可以在这里找到:http://www.w3.org/TR/REC-xml/#NT-EncName ::
在编码声明中,值“UTF-8
", " UTF-16
", " ISO-10646-UCS-2
“, 和 ”ISO-10646-UCS-4
“应该用于 Unicode / ISO/IEC 10646 的各种编码和转换,值”ISO-8859-1
", " ISO-8859-2
“,……”ISO-8859-
n "(其中 n 是零件编号)应用于 ISO 8859 的零件,并且值 "ISO-2022-JP
", " Shift_JIS
“, 和 ”EUC-JP
" 应用于 JIS X-0208-1997 的各种编码形式。建议使用互联网号码分配机构 [IANA-CHARSETS] 注册的字符编码(作为字符集),除了刚才列出的那些之外,还可以使用它们的注册名称;其他编码应使用以“x-”前缀开头的名称。XML 处理器应以不区分大小写的方式匹配字符编码名称,并且应将 IANA 注册名称解释为在 IANA 注册的该名称的编码,或者将其视为未知(当然,处理器不需要支持所有 IANA 注册的编码)。
[IANA-CHARSETS] 是:
(互联网号码分配机构)字符集的正式名称,编辑。凯尔德·西蒙森等人。 (看http://www.iana.org/assignments/character-sets.)
这些规格可能有点冗长。在您的问题中,您所需要做的就是找出记录字符串的编码。顺便说一句。不能说我无法重现你的exact输出,我总是得到十进制实体,而不是十六进制实体。您也许可以通过以下方式提供更多信息字符串的十六进制转储.