Есть ли способ заставить json_encode () работать и отображать эти символы, вместо того, чтобы использовать utf8_encode () во всех моих строках и заканчивая такими вещами, как "\ u0082"?
Если у вас есть строка в кодировке ANSI, использование utf8_encode()
является неправильной функцией для решения этой проблемы.Вам необходимо сначала правильно преобразовать его из ANSI в UTF-8.Это, безусловно, уменьшит количество escape-последовательностей Unicode, таких как \u0082
, из вывода json, но технически эти последовательности действительны для json , вы не должны их бояться.
Преобразование ANSI в UTF-8 с PHP
json_encode
работает с UTF-8
закодированными строками * только 1019 * .Если вам нужно успешно создать действительный json
из строки, закодированной в ANSI
, вам необходимо сначала перекодировать / преобразовать его в UTF-8
.Тогда json_encode
будет работать так, как задокументировано.
Чтобы преобразовать кодировку из ANSI
(точнее, я предполагаю, что у вас есть кодированная строка Windows-1252
, которая популярна, но ошибочно называется ANSI
)в UTF-8
вы можете использовать функцию mb_convert_encoding()
:
$str = mb_convert_encoding($str, "UTF-8", "Windows-1252");
Другая функция в PHP, которая может преобразовывать кодировку / кодировку строки, называется iconv
на основе libiconv .Вы также можете использовать его:
$str = iconv("CP1252", "UTF-8", $str);
Примечание к utf8_encode ()
utf8_encode()
работает только для Latin-1
, но не для ANSI
.Таким образом, вы будете уничтожать часть своих символов внутри этой строки, когда будете выполнять ее через эту функцию.
Связанный: Что такое формат ANSI?
Для более детального контроля того, что возвращает json_encode()
, см. Список предопределенных констант (зависит от версии PHP, включая PHP 5.4, некоторые константы остаются недокументированными и пока доступны в исходном коде).
Изменение кодировки массива / итеративно (комментарий PDO)
Как вы написали в комментарии, у вас есть проблемы с применением функции к массиву, вот пример кода. всегда необходимо для сначала изменить кодировку перед использованием json_encode
.Это просто стандартная операция с массивом, для более простого случая pdo::fetch()
a foreach
итерации:
while($row = $q->fetch(PDO::FETCH_ASSOC))
{
foreach($row as &$value)
{
$value = mb_convert_encoding($value, "UTF-8", "Windows-1252");
}
unset($value); # safety: remove reference
$items[] = array_map('utf8_encode', $row );
}