【问题标题】:array_map causing issues with extended ASCII for chr() (PHP)array_map 导致 chr() (PHP) 的扩展 ASCII 问题
【发布时间】:2016-11-01 08:15:02
【问题描述】:

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

脚本期望字符串以字节数据的形式传递给它。例如,我有字符串:

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。对?或者我应该/可以这样做不涉及上述代码行的另一种方式?

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

【问题讨论】:

  • 您好,ASCII 是 0-128,我相信还有什么需要编码的。有类似“扩展 ASCII”here 但整数与您的不匹配(171 == 1/2 而不是引号)。现在您的示例匹配 latin1 - en.wikipedia.org/wiki/ISO/IEC_8859-1。所以我会说尝试this 重新编码为 UTF8...
  • @urban 感谢您的链接 - 使用 utf8_encode() 包围字符串,以及设置标题类型。

标签: php ascii special-characters


【解决方案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));

【讨论】:

  • 是的,完美。 header() 以及用 utf8_encode() 围绕字符串完美地完成了这个技巧。谢谢!
猜你喜欢
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-05
  • 1970-01-01
相关资源
最近更新 更多