PHP - замените JSON на правильный символ Unicode - PullRequest
0 голосов
/ 19 мая 2018

Хорошо, у меня есть JSON, и при декодировании я распечатываю результат.Перед декодированием JSON я использую stripslashes () для удаления лишних слешей.JSON содержит ссылки на веб-сайты, такие как https://www.w3schools.com/php/default.asp, и описания, такие как Hello World, I have u00249999999 dollars

. Когда я распечатываю JSON, мне бы хотелось, чтобы он распечатал Hello World, I have $9999999 dollars, но распечатал Hello World, I have u00249999999 dollars.

Я предполагаю, что u0024 не анализируется, потому что у него нет обратной косой черты, хотя дело в том, что прямая косая черта ссылок на сайте не удаляется через косую черту, что хорошо - я думаю,что обратные косые черты для символов Unicode удаляются с помощью stripslashes ();

Как мне заставить PHP автоматически обнаруживать и анализировать знак доллара Unicode?Я также хотел бы применить это правило к каждому символу Unicode.

Заранее спасибо!

Ответы [ 3 ]

0 голосов
/ 19 мая 2018

Согласно документации PHP на stripslashes (), она

не заключает в кавычки строку в кавычках.

Что означает, что онав основном удаляет все обратные слэши, которые используются для экранирования символов (или последовательностей Юникода).При их удалении у вас практически нет шансов быть полностью уверенными в том, что любая последовательность, как "u0024", должна была быть сущностью Юникода, ваш пользователь мог просто ввести ее.

Кроме того, у вас возникнут некоторые проблемыпри использовании stripslashes () для значения JSON, которое содержит экранированные кавычки.Рассмотрим следующий пример:

{
  "key": "\"value\""
}

Это станет недействительным при использовании stripslashes (), потому что тогда оно будет выглядеть так:

{
  "key": ""value""
}

Что не может быть проанализировано, поскольку оно недопустимоОбъект JSON.Если вы не используете stripslashes (), все escape-последовательности будут преобразованы анализатором JSON, и перед выводом (декодированного) объекта JSON на клиент PHP автоматически декодирует (или «конвертирует») последовательности Unicode, которые могут содержать ваши данные..

Вывод: Я бы предложил не использовать stripslashes () при работе с сущностями JSON, так как это может сломать вещи (как видно из предыдущего примера, но также и в вашей проблеме).

0 голосов
/ 19 мая 2018

Главный вопрос, который вы должны понять: зачем вам снимать косые черты?И, если действительно необходимо убрать косые черты, как управлять кодировкой?Возможно, это хорошая идея для преобразования символов Unicode до в слэши, а не после, используя html_entity_decode .

В любом случае, вы можете попытаться решить проблему с помощью этого временного решения:

$string = "Hello World, I have u00249999999 dollars";
$string = preg_replace( "/u([0-9A-F]{0,4})/", "&#x$1;", $string ); // recover "u" + 4 alnums
$string = html_entity_decode( $string, ENT_COMPAT, 'UTF-8' ); // convert to utf-8
0 голосов
/ 19 мая 2018

Ваше предположение верно: u0024 не анализируется, поскольку не имеет обратной косой черты.Вы можете использовать регулярное выражение для добавления обратной косой черты после преобразования.

Похоже, у вас есть строки в кодировке UTF-8, PHP выводит их правильно, но ваш браузер не может автоматически определить кодировку (он принимает решение для ISO8859-1 или другое кодирование).

Лучший способ - сообщить браузеру, что используется UTF-8, отправив соответствующий заголовок HTTP:

header("content-type: text/html; charset=UTF-8"); 

Затем вы можетеоставьте остальную часть своего кода как есть и не нужно html-кодировать сущности или создавать другой беспорядок.

Если вы хотите, вы можете дополнительно объявить кодировку в сгенерированном HTML с помощью <meta>тег:

<meta http-equiv=Content-Type content="text/html; charset=UTF-8"> for HTML <=4.01
<meta charset="UTF-8">

для HTML5 Заголовок HTTP имеет приоритет над тегом <meta>, но последний может быть полезен, если HTML-код сохраняется в HD и затем читается локально.

...