array_map导致chr()的扩展ASCII问题(PHP)

时间:2016-11-01 08:15:03

标签: php ascii special-characters

我正在编写一个脚本,我遇到了一些问题。

脚本期望字符串在字节数据中传递给它。举个例子,我有字符串:

  

61,68,71,61,68,101,118,105,101,116,104

原来是= DG = Devieth。以下代码获取该行并成功转换它:

$sv_reportee = implode(array_map('chr', explode(',', $_GET['defendant'])));

现在,假设我将该字符串更改为包含171(«)和187(»)。该脚本不会发出任何警告,没有通知或其他任何内容......它只是拒绝在处理变量方面做更多的工作。它会通过很好的方式运行其他函数,但运行print($ sv_reportee)导致该变量完全没有任何内容。

这是我对上述代码行的参考:PHP Get String Text From Bytes

现在,根据我的理解,chr()应该能够在ASCII表上处理0-255。对?或者是否有其他方式我应该/可能这样做不涉及上述代码行?

值得一提的是,由于应用程序另一方面的限制,字符串必须以字节形式发送。不幸的是,没有别的方法 - 我们已经用尽了所有其他可能的选择。

1 个答案:

答案 0 :(得分:1)

chr将整数转换为原始字节的含义是什么意思:

  chr(171)
→ "\xAB"
= 1010 1011

就是这样。 171不等于字符“«”。它等于的是字节0xAB。如何将其转换为字符是一个不同的故事,取决于该字节被解释为什么编码。 0xAB碰巧在ISO-8859-1编码中等于“«”。假设您在浏览器中测试了这个,这将输出“«”:

header('Content-Type: text/html; charset=iso-8859-1');
echo chr(171);

这里你明确告诉浏览器将数据解释为什么编码。如果“没有”出现,可能无论是什么解释字节,因为字符使用的编码0xAB并不意味着什么。如果你不想使用ISO-8859-1(通常这些天你不应该),你需要将数据转换为另一种编码:

header('Content-Type: text/html; charset=utf-8');
echo iconv('ISO-8859-1', 'UTF-8', chr(171));