Конвертировать пронумерованные сущности HTML в php в unicode для использования на iPhone - PullRequest
0 голосов
/ 02 декабря 2010

Я создаю веб-сервис для переноса json в приложение для iPhone.Я использую json-framework для получения json, и это прекрасно работает, потому что он автоматически декодирует такие вещи, как "\ u2018".Проблема, с которой я сталкиваюсь, заключается в том, что не представляется всеобъемлющим способом получить все символы одним махом.

Например, html_entity_decode() получает большинство вещей, но оставляет такие вещи, как '( ').Чтобы поймать эти объекты и преобразовать их во что-то, что может использовать json-framework (например, \ u2018), я использую этот код для преобразования & # в \ u, преобразования чисел в шестнадцатеричное и затем обрезки конечной точки с запятой.

function func($matches) {
  return "\u" . dechex($matches[1]);
}
$json = preg_replace_callback("/&#(\d{4});/", "func", $json);

В данный момент это работает для меня, но это не так.Похоже, что я определенно скучаю по некоторым персонажам, которые будут преследовать меня позже.

Кто-нибудь видит недостатки в этом подходе?Кто-нибудь может вспомнить персонажей, которых этот подход упустит?

Любая помощь будет наиболее ценной!

Ответы [ 3 ]

6 голосов
/ 06 декабря 2010

Откуда вы получаете этот HTML-кодированный ввод?Если вы просматриваете веб-страницу, вы должны использовать HTML-парсер, который расшифрует ссылки на сущности и символы.Если вы получаете их во входных данных формы, у вас есть проблема с кодировками (чтобы избежать этого, убедитесь, что страница, содержащая форму, используется как UTF-8).

Если вы должны конвертировать HTML-кодированный фрагмент литерального текста в JSON, вы должны сделать это сначала путем HTML-декодирования, а затем JSON-кодировки, вместо того, чтобы пытаться перейти прямо в формат JSON (что не удастся для группы других символов, которые необходимо экранировать).Используйте встроенные функции декодера и кодирования, а не пытайтесь создавать символы в кодировке JSON, такие как \u.... самостоятельно (поскольку там есть ловушки).

$html= 'abc " def Ӓ ghi ሴ jkl \n mno';
$raw= html_entity_decode($html, ENT_COMPAT, 'utf-8');
$json= json_encode($raw);

"abc \" def \u04d2 ghi \u1234 jkl \\n mno"
0 голосов
/ 12 июня 2013
$html_escape = ""Love sex magic rise" & 尹真希 ‘";
$utf8 = mb_convert_encoding($html_escape, 'UTF-8', 'HTML-ENTITIES');
echo json_encode(array(
    "title" => $utf8
));

// {"title":"\"Love sex magic rise\" & \u5c39\u771f\u5e0c \u2018"}

Это хорошо работает для меня

0 голосов
/ 02 декабря 2010

‘ - это объект с десятичным номером, в то время как я считаю, \u2018 - это шестнадцатеричное представление. HTML также поддерживает шестнадцатеричные пронумерованные сущности (например, ‘), но как только вы найдете # в качестве префикса сущности, вы увидите десятичный или шестнадцатеричный код. Существуют также именованные объекты (например, &), но это не похоже на то, что вам нужно охватить эти случаи в своем коде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...