PHP не может декодировать символы ASCII - PullRequest
0 голосов
/ 06 июня 2019

Я исследую проблему, когда браузер отправляет данные в Apache (2.4) / PHP (7.2 Mac) и PHP не может декодировать некоторые байты в печатный символ. Символом является '-' (шестнадцатеричное значение 2D задается, когда символ копируется и вставляется в https://www.online -toolz.com / tools / text-hex-convertor.php и шестнадцатеричный ASCII, переведенный здесь - https://ascii.cl/), но отображается как в PHP.

MariaDB отображает точный символ и сообщает о длине значения столбца источника данных как 250 символов. Данные собираются PHP PDO и передаются в форму HTML и используются в качестве значения для формы ввода текста. Символ отлично отображается в HTML-дом. Однако, когда данные 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 не может правильно распознать оригинальный символ и сообщает, что длина строки равна +1 по сравнению с MySQL? Я предполагаю, что PHP должен уметь правильно обрабатывать все символы ASCII.

ОБНОВЛЕНИЕ:

Когда я печатаю оригинальную строку (которая не печатается) в HTML-документе (перед отправкой обратно в PHP), длина строки указывается как 249 символов, а символ '-' можно распечатать.

1 Ответ

0 голосов
/ 06 июня 2019

Это '-' - – или U-2013. Если он доставлен как ASCII, то отправляются 3 символа ASCII: 0xe2 0x80 0x93. Первый код â в 8-битном ASCII, но не определен в стандартном ASCII (7-битном). Другие 2 символа являются элементами управления в ACII 8-битном. Так что 3 "?" все в порядке.

Во всяком случае, вы сказали, что стандартный знак Муни также поставляется как 3 "?". Это очень необычно. Пожалуйста, подтвердите это снова.

...