我在unicode(UTF-16)值和PHP / XML方面遇到了很多麻烦。我想从XML中读取一组unicode值,并将正确的字形输出到浏览器。我尝试过使用UTF-8,我也遇到了同样的问题。
这是我用于第一次测试的简单工作示例:
$text = "\x00\x41";
$text = mb_convert_encoding($text, "ASCII", "UTF-16");
echo $text;
输出上述代码:
A
但是,当我尝试从XML获取值时,事情就会停止工作。
XML:
<glyphs>
<code>0041</code>
<code>0042</code>
<code>0043</code>
<code>0044</code>
<code>0045</code>
<code>0046</code>
</glyphs>
在php中,我从上面的xml读取每个值,分成对和格式,例如\ x00 \ x41等
PHP:
// load xml
$xml = simplexml_load_file('encoding.xml');
if ($xml) {
// get families
foreach($xml->children() as $item) {
$pairs = str_split($item, 2);
$hex = "\x" . $pairs[0] . "\x" . $pairs[1];
// check value...
echo $hex . '<br/>';
$text = mb_convert_encoding($hex, "ASCII", "UTF-16");
echo $text;
}
}
else {
return 'The input is malformed.';
}
浏览器输出:
\x00\x41
????
\x00\x42
????
\x00\x43
????
\x00\x44
????
\x00\x45
????
\x00\x46
????
问号应为A,B,C,D,E,F。
我做错了什么?
感谢。
答案 0 :(得分:1)
“\ x00”是字符串中的十六进制表示法,在编译时处理。
我认为当你使用“\ x”+“00”时,编译器首先试图找出“\ x”是什么(我不知道结果是什么),然后才连接“00”,所以结果不是你所期望的。
也许这个问题可以帮助,虽然它是在Java中 - &gt; Java: Convert String "\uFFFF" into char
编辑:只是跟进评论。将文字“\ x41”放在xml中也无济于事,因为那时你正在读一个包含4个字符的字符串。
因此,您的问题可以重述为:如何使用UTF-16将十六进制数值的字符串表示形式转换为单个字符。这是我在上面链接的问题中遇到的问题,除了你想在php而不是Java中进行。
答案 1 :(得分:1)
您的测试程序为每个测试字符写入几个ASCII字符,后跟ASCII中的“
”,后跟两个字节的UTF-16。这不行。一个文件一次只能使用一个字符编码。
首先,重写脚本以将所有输出转换为UTF-16(或其他)。
其次,您的浏览器似乎将您的混合编码文件解释为UTF-16以外的其他内容,可能是ISO 8859-1或Windows Latin 1,它们是常见的默认值。浏览器不太可能将文件解释为UTF-16 unless explicitly directed to (in the HTTP header or content type meta tag)。如果您未指定内容类型(检查您的Web服务器是否正在发送默认值),则某些浏览器会尝试猜测编码。我怀疑有人会猜你的混合文件是UTF-16。
在您确认浏览器根据您指定的内容类型解释文件之前,不要指望任何内容可以正常工作。
最后,我建议使用iconv而不是mb_convert_encoding。 iconv得到了更好的维护,并且拥有更广泛的支持编码。
答案 2 :(得分:0)
您是否在标题中正确设置输出?
header('Content-Type: text/html; charset=utf-8');
...还有HTML头?
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />