json_encode () non utf-8 строки?

Поэтому у меня есть массив строк, и все строки используют кодировку ANSI по умолчанию и вытаскиваются из базы данных sql. Таким образом, существует 256 различных возможных значений байтовых символов (однобайтная кодировка). Есть ли способ, которым я могу заставить json_encode () работать и отображать эти символы вместо того, чтобы использовать utf8_encode () для всех моих строк и заканчивать такими вещами, как «\ u0082»?

Или это стандарт для json?

Есть ли способ, которым я могу заставить json_encode () работать и отображать эти символы вместо того, чтобы использовать utf8_encode () для всех моих строк и заканчивать такими вещами, как «\ u0082»?

Если у вас есть закодированная ANSI строка, использование utf8_encode() является неправильной функцией для решения этой проблемы . Вам необходимо правильно преобразовать его из ANSI в UTF-8. Это, безусловно, уменьшит количество escape-последовательностей Unicode, таких как \u0082 из json-вывода, но технически эти последовательности действительны для json , вы не должны их бояться.

Преобразование ANSI в UTF-8 с помощью PHP

json_encode работает только с закодированными строками UTF-8 . Если вам нужно создать корректный 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() foreach iteration:

 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 ); } с 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 ); } 

Стандарт JSON кодирует Unicode кодировку ENFORCES . Из RFC4627 :

 3. Encoding JSON text SHALL be encoded in Unicode. The default encoding is UTF-8. Since the first two characters of a JSON text will always be ASCII characters [RFC0020], it is possible to determine whether an octet stream is UTF-8, UTF-16 (BE or LE), or UTF-32 (BE or LE) by looking at the pattern of nulls in the first four octets. 00 00 00 xx UTF-32BE 00 xx 00 xx UTF-16BE xx 00 00 00 UTF-32LE xx 00 xx 00 UTF-16LE xx xx xx xx UTF-8 

Поэтому, в строгом смысле, ANSI-кодированный JSON недействителен JSON; поэтому PHP применяет кодировку json_encode() при использовании json_encode() .

Что касается «ANSI по умолчанию», я уверен, что ваши строки закодированы в Windows-1252. Он неправильно упоминается как ANSI.

 <?php $array = array('first word' => array('Слово','Кириллица'),'second word' => 'Кириллица','last word' => 'Кириллица'); echo json_encode($array); /* return {"first word":["\u0421\u043b\u043e\u0432\u043e","\u041a\u0438\u0440\u0438\u043b\u043b\u0438\u0446\u0430"],"second word":"\u041a\u0438\u0440\u0438\u043b\u043b\u0438\u0446\u0430","last word":"\u041a\u0438\u0440\u0438\u043b\u043b\u0438\u0446\u0430"} */ echo json_encode($array,256); /* return {"first word":["Слово","Кириллица"],"second word":"Кириллица","last word":"Кириллица"} */ ?> 

JSON_UNESCAPED_UNICODE (целое число) Кодировать символы многобайтового Юникода буквально (по умолчанию нужно вывести как \ uXXXX). Доступно с PHP 5.4.0.

http://php.net/manual/en/json.constants.php#constant.json-unescaped-unicode

Да, это стандартное поведение для json внутри PHP

Если вы читаете документацию: http://php.net/manual/en/function.json-encode.php
Вы увидите, что он может работать только с кодированными данными utf-8,

с другой стороны, вы можете использовать первый комментарий в: http://php.net/manual/en/function.json-encode.php#104278

и создать свою собственную функцию кодирования / декодирования, работающую с ANSI

 json_encode($str,JSON_HEX_TAG|JSON_HEX_AMP|JSON_HEX_APOS|JSON_HEX_QUOT); 

который преобразует ANSI на основе окон в utf-8, и ошибки больше не будет.

Я нашел следующий ответ для аналогичной проблемы с вложенным массивом, не кодированным utf-8, который мне пришлось кодировать json:

 $inputArray = array( 'a'=>'First item - à', 'c'=>'Third item - é' ); $inputArray['b']= array ( 'a'=>'First subitem - ù', 'b'=>'Second subitem - ì' ); if (!function_exists('recursive_utf8')) { function recursive_utf8 ($data) { if (!is_array($data)) { return utf8_encode($data); } $result = array(); foreach ($data as $index=>$item) { if (is_array($item)) { $result[$index] = array(); foreach($item as $key=>$value) { $result[$index][$key] = recursive_utf8($value); } } else if (is_object($item)) { $result[$index] = array(); foreach(get_object_vars($item) as $key=>$value) { $result[$index][$key] = recursive_utf8($value); } } else { $result[$index] = recursive_utf8($item); } } return $result; } } $outputArray = json_encode(array_map('recursive_utf8', $inputArray )); 

Используйте это вместо этого:

 <?php //$return_arr = the array of data to json encode //$out = the output of the function //don't forget to escape the data before use it! $out = '["' . implode('","', $return_arr) . '"]'; ?> 

Копировать из комментариев руководства json_encode php . Всегда читайте комментарии. Они полезны.