Ситуация
Я импортирую огромные файлы JSON в базу данных. Он содержит поля, которые были заполнены пользователями с помощью онлайн-редактора wysiwyg. Это позволяло им также вставлять специальные символы, обычно скопированные из документа MS Word.
Проблема
После декодирования файла JSON пара специальных символов пропущена. Оказывается, большинство из них — это, например, управляющие символы Unicode † который представляет собой символ U+0086.
Пример
<?php
$json = '{"test": "start \u0086 end"}';
$decoded = json_decode($json);
echo $decoded->test . PHP_EOL;
Вывод:
start end
Ожидаемый результат:
start † end
Временное исправление
На данный момент я применил это грязное исправление, но я все еще ищу более элегантный способ замены всех символов Юникода.
protected static function replaceUnicodeCharacters(&$string)
{
$replace = [
"\u0086" => "†",
"\u00b0" => "°",
"\u0093" => "“",
"\u0094" => "”",
"\u0091" => "‘",
"\u0092" => "’",
"\u009c" => "œ",
"\u00f6" => "ö",
"\u00f9" => "ù",
"\u00ad" => "",
"\u0096" => "–",
"\u00fb" => "û",
"\u00a0" => " ",
"\u0085" => "…",
"\u00ab" => "«",
"\u00bb" => "»",
"\u008c" => "Œ",
"\u00c0" => "À",
"\u00ff" => "ÿ",
"\u00fc" => "ü",
];
$string = str_ireplace(array_keys($replace), array_values($replace), $string);
}