【发布时间】: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