我正在调查一个问题,其中浏览器正在将数据发送到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个字符,并且'-'字符可打印。
答案 0 :(得分:0)
此'–'是–
或U-2013。如果以ASCII形式发送,则发送3个ASCII字符:0xe2 0x80 0x93。第一个代码是ASCII 8位的â
,但在标准ASCII(7位)中未定义。其他2个字符是ACII 8位控件。那么3“?”可以。
无论如何,您说过,标准的munis标志也以3“?”的形式提供。这是非常不寻常的。请再次证明这一点。