如何在 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" 字符集可用。
ASCII 从 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', 'ß')));
我正在尝试解码这个特殊字符:“ß”,如果我使用 "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" 字符集可用。
ASCII 从 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', 'ß')));