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

How to display the (extended) ASCII representation of a special character in PHP 5.6?

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

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

...但这看起来不太好;所以我尝试了 "bin2hex()",现在我得到 "C39F"(什么?)。

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

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

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

是否可以得到 "DF" 输出?

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

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

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

Returns the ASCII value of the first character of string.

ASCII (a fairly small 7-bit charset) does not have any encoding for the ß character (aka U+00DF LATIN SMALL LETTER SHARP S)。严重地。 ASCII 甚至没有 DF 位置(它上升到 7E)。

您在 bin2hex 的正确道路上,您感到困惑的只是编码。目前您看到的是 UTF-8 编码的 ß 的十六进制值,因为您的字符串是用 UTF-8 编码的。您想要的是该字符串在其他编码中的十六进制值。假设 "Extended ASCII" 指的是 ISO-8859-1,因为它通俗地经常这样做(但不一定):

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

话虽如此,我不知道您会将这些信息用于什么目的。在各种不同的编码中,字符 ß 有许多有效的 "hex values"; "Extended ASCII" 只是一个可能的答案,而且肯定是一个模糊的答案,因为 "Extended ASCII" 几乎没有实际意义,有数百种不同的 "Extended ASCII" 字符集可用。

A​​SCII 从 0x00 到 0x7F。这不足以表示所需的所有字符,因此历史上旧的 Windows 操作系统使用一个字节(从 0x80 到 0xFF)中可用的 space 来表示不同的字符,具体取决于本地化。这就是代码页:非 ASCII 值到非 ASCII 字符的任意映射。你所说的 "extended ASCII" 是 IMO 代码页的不恰当名称。

假设 1 字节 - 1 个字符已死并且(如果不是)必须死。

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

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