繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM