Замените JSON на правильный символ Unicode

Итак, у меня есть немного 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 удаляется с помощью полоски ();

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

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

1

Решение

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

снять кавычки в кавычках.

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

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

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

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

{
"key": ""value""}

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

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

1

Другие решения

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

Похоже, что у вас есть внутренние строки в кодировке UTF-8, PHP выводит их правильно, но ваш браузер не может автоматически определить кодировку (он выбирает ISO 8859-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, а затем читается локально.

1

Главный вопрос, который вы должны понять: зачем вам снимать косые черты?
И, если действительно необходимо убрать косые черты, как управлять кодировкой? Вероятно, это хорошая идея для преобразования символов 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
1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector