【问题标题】:PHP unable to decode ASCII characterPHP无法解码ASCII字符
【发布时间】:2019-10-21 10:02:11
【问题描述】:

我正在调查浏览器向 Apache(2.4) / PHP (7.2 Mac) 发送数据并且 PHP 无法将某些字节解码为可打印字符的问题。字符是 '-'(当字符被复制并粘贴到 https://www.online-toolz.com/tools/text-hex-convertor.php 和此处转换为 ASCII 十六进制 - https://ascii.cl/ 时,会给出十六进制值 2D),但 PHP 显示为 ���。

MariaDB 可以很好地显示字符,并将数据源列值的长度报告为 250 个字符。数据由 PHP PDO 收集并传递到 HTML 表单并用作文本输入表单的值。该字符在 HTML dom 中显示良好。但是,当 POST 数据通过 Apache 提交回 PHP 时,PHP 说字符串长度为 251 个字符,然后破坏了我的字符串长度清理程序。

我找到了一个简短的 Python 命令来查看二进制文件。我从Sequel Pro 中复制并粘贴了该字符,并将其放入此脚本中。

import binascii
bin(int(binascii.hexlify('-'), 16))
'0b101101'

编码的历史是它来自 Google Docs 文档,下载为 .txt,在 Mac Text Edit 中打开并使用“UTF-8”编码保存,然后通过 python 传递到 MySQL 数据库,通过PHP 到 HTML 并提交回 PHP。

我已经用另一个字符“-”(十六进制值 e28093)替换了数据库中的字符,下面有二进制输出,一切正常。

 bin(int(binascii.hexlify('–'), 16))
'0b111000101000000010010011'

关于为什么 PHP 无法正确识别原始字符并将字符串长度报告为与 MySQL 相比 +1 的任何想法?我假设 PHP 应该能够正确处理所有 ASCII 字符。

更新:

当我在 HTML dom 中打印出原始字符串(不可打印)时(在发回 PHP 之前),字符串长度报告为 249 个字符,并且“-”字符是可打印的。

【问题讨论】:

  • 你确定结尾没有空格或换行符吗?
  • 我确定。 @Wiimm 回答到目前为止理解并解释了我正在经历的情况。

标签: php character-encoding ascii


【解决方案1】:

这个“-”是– 或 U-2013。如果以 ASCII 格式交付,则发送 3 个 ASCII 字符:0xe2 0x80 0x93。第一个代码是 ASCII 8 位中的 â,但在标准 ASCII(7 位)中未定义。其他 2 个字符是 ACII 8 位中的控件。所以3“?”没问题。

无论如何,您说过,标准市政标志也以 3 个“?”的形式交付。这是非常不寻常的。请再次证明这一点。

【讨论】:

  • 不,标准的减号不是作为 3 个“?”提供的,它运行良好。我将更改 OP 以澄清这一事实。
  • 所以,这可以解释为什么在输出到 DOM 之前打印时,str_length 为 249,而从 DOM 返回时,字符串长度为 251。但是(1)为什么数据库会报告字符串长度为 250,(2)你是说浏览器尽管接收到 8 位 ASCII 码,但仍将 ASCII 码返回为 7 位?
猜你喜欢
  • 2016-02-12
  • 2015-10-21
  • 2010-12-11
  • 2012-07-02
  • 2010-12-11
  • 1970-01-01
  • 2018-05-05
相关资源
最近更新 更多