PHP json_encode json_decode UTF-8

19

Как сохранить строку json-encoded с международными символами в базу данных и затем проанализировать декодированную строку в браузере?

<?php           
    $string = "très agréable";  
    // to the database 
    $j_encoded = json_encode(utf8_encode($string)); 
    // get from Database 
    $j_decoded = json_decode($j_encoded); 
?>    
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
    <?= $j_decoded ?>
</html> 
    
задан FFish 02.11.2010 в 11:59
источник
  • Практически так, как вы показываете. Что не работает? –  Pekka 웃 02.11.2010 в 12:01
  • это дает мне: très agrà© –  FFish 02.11.2010 в 12:05
  • Попробуйте установить кодировку для вашей страницы в UTF-8 ... <meta http-equiv="Content-Type" content="text / html; charset = UTF-8" /> в блоке <head> –  Mark Baker 02.11.2010 в 12:08
  • @Mark, это сработало, но только при использовании $ j_encoded = json_encode ($ string); поэтому без utf8_encode () –  FFish 02.11.2010 в 12:17
  • @FFish избавиться от utf8_encode () в вашем коде, я просто увидел, что (Edit: ah, вы были быстрее) –  Pekka 웃 02.11.2010 в 12:17
Показать остальные комментарии

8 ответов

21

Это проблема с кодировкой. Похоже, в какой-то момент данные будут представлены как ISO-8859-1.

Каждая часть вашего процесса должна кодироваться в кодировке UTF-8.

  • Соединение с базой данных

  • Таблицы базы данных

  • Ваш PHP-файл (если вы используете специальные символы внутри этого файла, как показано в приведенном выше примере)

  • Заголовки content-type , которые вы выводите

ответ дан Pekka 웃 02.11.2010 в 12:17
  • Я думаю, что это лучший ответ, мне нужно проверить мою кодировку в БД! –  FFish 02.11.2010 в 13:18
  • Вы можете добавить код, необходимый для выполнения всего этого. –  Pedro Moreira 29.06.2014 в 16:54
27

json utf8 кодирует и декодирует:

json_encode($data, JSON_UNESCAPED_UNICODE)

json_decode($json, false, 512, JSON_UNESCAPED_UNICODE)

force utf8 также может быть полезен: Ссылка

    
ответ дан Lukas Liesis 24.05.2015 в 16:55
  • зачем давать минус? У меня было достаточно ситуаций, когда это единственный способ работать. Не рассказывайте мне все о кодировании файла, базы данных и т. Д. Есть ситуации, когда вы не знаете кодировку своего ресурса, и это происходит случайно. Некоторые utf8 некоторые другие вы можете себе представить. –  Lukas Liesis 28.07.2015 в 12:23
  • Единственное, что сработало для меня, я создаю API, и мне нужно чисто распечатать ответ как json с закодированными символами –  Terkhos 17.06.2016 в 22:02
  • Спасибо, Лукас, это именно то, что я искал. Он преобразует кодировку, такую ​​как \ u00e9 в é. Я только что подтвердил его использование в документах PHP (пример 2). Мне все еще интересно, действительно ли параметр глубины полезен? Если рекурсия остановлена ​​на некоторой глубине, означает ли это, что json не будет полностью en / decoded в соответствии с битовой маской? –  CPHPython 29.08.2016 в 20:11
25
  header('Content-Type: application/json; charset=utf-8');
    
ответ дан Ahmet Erkan ÇELİK 23.12.2013 в 20:45
11

Если ваш исходный файл уже является utf8, то отключите функции utf8_ *. php5 хранит строки как массив байтов.

вы должны добавить метатег для кодирования в html И вы должны добавить HTTP-заголовок, который устанавливает transferencoding в utf-8.

<html>
<head>
   <meta http-equiv="Content-Type" content="text/html; charset=utf-8">

и в php

<?php
header('Content-Type: text/html; charset=utf-8');
    
ответ дан Bernd Ott 02.11.2010 в 12:17
4

Попробуйте отправить заголовок Charset UTF-8:

<?php header ('Content-type: text/html; charset=utf-8'); ?>

И HTML мета:

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    
ответ дан Coquevas 02.11.2010 в 12:17
3
  1. utf8_decode $j_decoded = utf8_decode(json_decode($j_encoded)); ИЗМЕНИТЬ или, вернее, $j_encoded = json_encode($j_encoded); $j_decoded = json_decode($j_encoded); нет необходимости в en / decoding utf8
  2. <meta charset="utf-8" />
ответ дан teemitzitrone 02.11.2010 в 12:13
  • Зачем нужен utf8_decode () (который преобразуется в ISO-8859-1) в среду UTF-8? –  Pekka 웃 02.11.2010 в 12:15
  • нормально, я вижу. У меня также есть utf8_decode (). Есть ли разница в использовании utf8_decode (json_decode ($ j_encoded)) vs json_decode (utf8_decode ($ j_encoded))? –  FFish 02.11.2010 в 12:19
  • да, и это правильно, и вы не должны использовать utf8_encode. но так, как вы это использовали, это пот. 1 вы кодируете utf8, а затем json, чтобы получить свой вход, вы должны декодировать json, а затем utf8 –  teemitzitrone 02.11.2010 в 12:25
  • @Pekka, если вы все равно испортите кодировку (см. utf8_encode), вы должны ее исправить. хорошо, не испортить кодировку, также является решением, и я отредактировал свой ответ, чтобы отразить, что –  teemitzitrone 02.11.2010 в 12:30
0

, если вы получили ошибку «неожиданного символа», вы должны проверить, есть ли спецификация (маркер байтового заказа, сохраненный в вашем utf-8 json. Вы можете либо удалить первый символ, либо сохранить, если без спецификации.

    
ответ дан Blox 09.10.2016 в 06:17
0

Работайте со мной:)

function jsonEncodeArray( $array ){
    array_walk_recursive( $array, function(&$item) { 
       $item = utf8_encode( $item ); 
    });
    return json_encode( $array );
}
    
ответ дан Douglas Comim 26.07.2017 в 21:54
  • Спасибо, это указывало мне дорогу, за исключением того, что сначала было хуже! :) тогда я понял, что это было потому, что что-то явно было «закодировано» где-то глубже в стеке, поэтому - возможно, странно - изменение utf8_encode на utf8_decode было решено. –  randomsock 16.02.2018 в 21:20