PHP无法解码ASCII字符

时间:2019-06-05 21:21:14

标签: php character-encoding ascii

我正在调查一个问题,其中浏览器正在将数据发送到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个字符,并且'-'字符可打印。

1 个答案:

答案 0 :(得分:0)

此'–'是–或U-2013。如果以ASCII形式发送,则发送3个ASCII字符:0xe2 0x80 0x93。第一个代码是ASCII 8位的â,但在标准ASCII(7位)中未定义。其他2个字符是ACII 8位控件。那么3“?”可以。

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