我正在尝试解码这个特殊字符:“ß”,如果我使用“ord()”,我会得到“C3”
echo "ord hex--> " . dechex(ord('ß'));
......但看起来并不好;所以我试过“bin2hex()”,现在我得到“C39F”(什么?)。
echo "bin2hex --> " . bin2hex('ß');
通过使用来自Internet的扩展ASCII表,我知道正确的十六进制值是“DF”,所以我现在尝试“hex2bin()”,但是这给了我一些未知的字符:“ ”。< / p>
echo "hex2bin --> " . hex2bin('DF');
是否可以获得“DF”输出?
答案 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
)。