如何在PHP 5.6中显示特殊字符的(扩展)ASCII表示?

时间:2017-12-19 14:25:39

标签: php php-5.6

我正在尝试解码这个特殊字符:“ß”,如果我使用“ord()”,我会得到“C3”

echo "ord hex--> "  . dechex(ord('ß'));

......但看起来并不好;所以我试过“bin2hex()”,现在我得到“C39F”(什么?)。

echo "bin2hex --> " . bin2hex('ß');

通过使用来自Internet的扩展ASCII表,我知道正确的十六进制值是“DF”,所以我现在尝试“hex2bin()”,但是这给了我一些未知的字符:“ ”。< / p>

echo "hex2bin --> " . hex2bin('DF');

是否可以获得“DF”输出?

3 个答案:

答案 0 :(得分:1)

你在bin2hex的正确道路上,你感到困惑的只是编码。目前,您正在看到UTF-8编码的十六进制值,因为您的字符串是以UTF-8编码的。你想要的是在其他一些编码中该字符串的十六进制值。假设“扩展ASCII”是指ISO-8859-1,因为它通常通常(但不必):

echo bin2hex(iconv('UTF-8', 'ISO-8859-1', 'ß'));

现在,说了这些,我不知道你使用的是什么信息。在各种不同的编码中,字符ß有许多有效的“十六进制值”; “扩展ASCII”只是一个可能的答案,这是一个模糊的答案,因为“扩展ASCII”几乎没有实际意义,可以使用数百种不同的“扩展ASCII”字符集。

答案 1 :(得分:1)

ASCII从0x00变为0x7F。这还不足以代表所需的所有字符,因此历史悠久的Windows操作系统使用字节中的可用空间(从0x80到0xFF)来表示不同的字符,具体取决于本地化。这就是代码页的含义:非ASCII值到非ASCII字符的任意映射。你叫什么&#34;扩展的ASCII&#34; IMO是代码页的不恰当名称。

假设1字节 - 1个字符已经死亡,(如果不是)必须死亡。

所以你看到的实际上是ß的UTF-8表示。如果要查看UNICODE代码点值ß(或任何其他字符),只需显示其AFAIK以1:1方式映射的UTF-32表示。

// Print 000000df
echo bin2hex(iconv('UTF-8', 'UTF-32BE', 'ß')));                          

答案 2 :(得分:0)

bin2hex()应该没问题,只要你知道你正在使用什么编码。

您获得的C3输出似乎是UTF-8中字符的双字节表示的第一个字节(这意味着您已将编辑器配置为以此类编码保存文件,这是2017年的一个好主意。)

ord() function不接受任意编码,更不用说与Unicode兼容的编码,例如UTF-8:

  

返回string的第一个字符的 ASCII 值。

ASCII(一个相当小的7位字符集)没有ß character(又名U+00DF LATIN SMALL LETTER SHARP S)的任何编码。认真。 ASCII甚至没有DF位置(它最多可达7E)。

相关问题