[英]array_map causing issues with extended ASCII for chr() (PHP)
我正在处理一个脚本,但遇到了一些问题。
该脚本希望字符串以字节数据的形式传递给它。 例如,我有以下字符串:
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从字节获取字符串文本
现在,据我了解,chr()应该能够处理ASCII表中的0-255。 对? 还是我应该/可以做的另一种方式不涉及上面的代码?
值得一提的是,由于应用程序另一方面的限制,字符串必须以字节形式发送。 不幸的是,没有其他解决办法-我们用尽了所有其他可能的选择。
什么chr
所做的只是一个整数转换成原始字节,意思是:
chr(171)
→ "\xAB"
= 1010 1011
就这些。 171
不等于字符“«”。 它等于字节0xAB
。 如何将其转换为字符是另一回事,并且取决于该字节被解释为哪种编码。 在ISO-8859-1编码中, 0xAB
恰好等于“«”。 假设您正在浏览器中对此进行测试,则将输出“«”:
header('Content-Type: text/html; charset=iso-8859-1');
echo chr(171);
在这里,您要明确告知浏览器将数据解释为哪种编码。 如果显示“ nothing”,则可能是将字节解释为字符的任何事情都使用了0xAB
并不表示任何含义的编码。 如果您不想使用ISO-8859-1(通常现在不应该使用),则需要将数据转换为另一种编码:
header('Content-Type: text/html; charset=utf-8');
echo iconv('ISO-8859-1', 'UTF-8', chr(171));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.