2010-11-02 4 views
18

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

<?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> 
+0

Довольно много, как вы показать. Что не работает? –

+0

это дает мне: très agrà  © able – FFish

+0

@FFish - ваш файл PHP, сохраненный как UTF-8? (Обычно есть выбор в «Сохранить как ..") - документ, который используется как UTF-8? Вы можете использовать тег Meta для тестирования:' ' –

ответ

18

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

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

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

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

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

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

+0

Я думаю, что это лучший ответ, мне нужно проверить мою кодировку в БД! – FFish

+0

Вы можете добавить код, необходимый для выполнения всего этого. –

3
  1. utf8_decode$j_decoded = utf8_decode(json_decode($j_encoded));РЕДАКТИРОВАТЬ или более правильно $j_encoded = json_encode($j_encoded);$j_decoded = json_decode($j_encoded); нет необходимости в ен/декодирования utf8
  2. <meta charset="utf-8" />
+0

Зачем нужен 'utf8_decode()' (который преобразуется в ISO-8859-1) в среде UTF-8? –

+0

ОК, я вижу. У меня также есть utf8_decode(). Есть ли разница в использовании utf8_decode (json_decode ($ j_encoded)) vs json_decode (utf8_decode ($ j_encoded))? – FFish

+0

Да, это так, и, быть может, вы не должны использовать 'utf8_encode' в любом случае, но так, как вы использовали это poit. 1 вы кодируете utf8, а затем json, чтобы получить свой вход, вы должны декодировать json, а затем utf8 – teemitzitrone

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'); 
4

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

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

И в HTML мета:

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
25
header('Content-Type: application/json; charset=utf-8'); 
26

JSON utf8 кодирования и декодирования:

json_encode($data, JSON_UNESCAPED_UNICODE) 

json_decode($json, false, 512, JSON_UNESCAPED_UNICODE) 

сила utf8 может быть полезно также: http://pastebin.com/2XKqYU49

+2

зачем давать минус? У меня было достаточно ситуаций, когда это единственный способ работать. Не рассказывайте мне все о кодировании файла, базы данных и т. Д. Есть ситуации, когда вы не знаете кодировку своего ресурса, и это происходит случайно. Некоторые utf8 некоторые другие вы можете себе представить. –

+2

это сработало для меня – Muath

+1

Спасибо.Это работало для меня. – sj59

0

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

0

Работа для меня :)

function jsonEncodeArray($array){ 
    array_walk_recursive($array, function(&$item) { 
     $item = utf8_encode($item); 
    }); 
    return json_encode($array); 
} 
+0

Спасибо, это указывало мне путь, за исключением того, что сначала это делало хуже! :) тогда я понял, что это было потому, что что-то явно было «закодировано» где-то глубже в стеке, поэтому - возможно, странно - изменение 'utf8_encode' на' utf8_decode' решило его. – randomsock

Смежные вопросы