Неожиданные результаты при декодировании Eicode Escape-последовательностей - PullRequest
0 голосов
/ 24 мая 2018

У меня есть этот черный ящик, который выплевывает JSON, и этот файл поставляется с тем, что Я предполагаю , экранированные символы Юникода.Вот фрагмент:

{
    "AR_DESCRI":"LIMA CENTIMETRADA\/FORMAS U\u00c3\u2018AS 100\/180 MANI."
}

Теперь вот как должен выглядеть итоговый JSON для любого разумного человека:

{
    "AR_DESCRI":"LIMA CENTIMETRADA/FORMAS UÑAS 100/180 MANI."
}

Самое важное, что \u00c3\u2018 должноравен символу Ñ.

Однако, как вы можете проверить из любого декодера Unicode Escape Sequence, это не так, выходной сигнал для \u00c3\u2018 на самом деле Ñ, что в основном случайный шум.

Я пробовал некоторые онлайн-декодеры , и я также использовал PHP-функции json_decode(), над которыми я сейчас работаю.Оба дают мне одинаковые результаты.Вот фрагмент кода, если вам интересно:

<?php
$json = '{"AR_DESCRI":"LIMA CENTIMETRADA\/FORMAS U\u00c3\u2018AS 100\/180 MANI."}';
print_r(json_decode($json));

//Output: stdClass Object ( [AR_DESCRI] => LIMA CENTIMETRADA/FORMAS UÑAS 100/180 MANI. )

Итак, мой вопрос: почему, черт возьми, это происходит, это проблема кодирования на стороне черного ящика?Я использую неправильную функцию?

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

1 Ответ

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

Ñ - это U+00D1, представленное в UTF8 в виде буквенных байтов \xc3\x91.

То, что у вас есть, это Моджибаке , вызванное неправильным принудительным вызовом cp1252-to-UTF-преобразование во входной строке, где в cp1252 \xc3 есть Ã, а \x91 равно .[оставленная одинарная кавычка]

Затем они конвертируются в эквивалентные им UTF-экранирования в виде \u00c3\u2018, который вы видите.

Доказательство:

function ordify($str) {
    return implode(' ', array_map(
        function($a){return sprintf('U+%04x', mb_ord($a));},
        preg_split('//u', $str, null, PREG_SPLIT_NO_EMPTY)
    ));
}

$borked = 'Ñ';
$fixed  = mb_convert_encoding($borked, 'cp1252', 'utf-8');

var_dump(
    $borked, ordify($borked),
    $fixed,  ordify($fixed)
);

Вывод:

string(5) "Ñ"
string(13) "U+00c3 U+2018"
string(2) "Ñ"
string(6) "U+00d1"

Итак, исправьте то, что генерирует ваш JSON, потому что любой разумный человек в первую очередь должен ценить достоверные данные, а не класть в бандитном решении.

...