我正在编写一个脚本,我遇到了一些问题。
脚本期望字符串在字节数据中传递给它。举个例子,我有字符串:
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。对?或者是否有其他方式我应该/可能这样做不涉及上述代码行?
值得一提的是,由于应用程序另一方面的限制,字符串必须以字节形式发送。不幸的是,没有别的方法 - 我们已经用尽了所有其他可能的选择。
答案 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));