json_encode () non utf-8 strings?

Så jeg har en række strenge,og alle strengene bruger systemets standard ANSI-kodning og blev trukket fra en SQL-database. Så der er 256 forskellige mulige tegnbyteværdier (kodning af enkeltbyte). Er der en måde, hvorpå jeg kan få json_encode () til at arbejde og vise disse tegn i stedet for at skulle bruge utf8_encode () på alle mine strenge og ender med ting som "\ u0082"?

Eller er det standarden for json?

25
задан hakre 7 July 2011 в 07:43
поделиться

2 ответа

Стандарт JSON ИСПОЛЬЗУЕТ кодировку Unicode . Из 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

Следовательно, в самом строгом смысле код JSON в формате ANSI не будет действительным JSON; Вот почему PHP применяет кодировку Unicode при использовании json_encode() .

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

10
ответ дан 28 November 2019 в 21:15
поделиться

Я нашел следующий ответ для аналогичной проблемы с вложенным массивом, не кодированным 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 ));
-2
ответ дан 28 November 2019 в 21:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: