Проблемы с кодированием - один формат в другой - PullRequest
5 голосов
/ 17 июля 2010

У меня есть скребок, который собирает некоторые данные из других источников, которые я не могу контролировать. Исходные данные делают все виды интересных символов Unicode, но они преобразуют их в довольно бесполезный формат, поэтому

\u00e4

для небольшого «а» с умлаутом (без двойных кавычек, которые, я думаю, должны быть там) *. конечно, это отображается в моем HTML как обычный текст.

Есть ли какой-нибудь реалистичный способ преобразовать источник Unicode в правильные символы, который не требует от меня ручного перебора каждой последовательности строк и замены их во время очистки?

* вот образец json, который он выплевывает:

({"content":{"pagelet_tab_content":"<div class=\"post_user\">Latest post by <span>D\u00e4vid<\/span><\/div>\n})

Ответы [ 2 ]

6 голосов
/ 17 июля 2010

Учитывая, что \ u00e4 является представлением Javascript символа Unicode, можно использовать функцию PHP * json_decode(), чтобы декодировать ее в строку PHP ...

Допустимая строка JSON будет выглядеть так:

$json = '"\u00e4"';

И это:

header('Content-type: text/html; charset=UTF-8');
$php = json_decode($json);
var_dump($php);

даст вам правильный вывод:

string 'ä' (length=2)

(это один символ, но длиной в два байта)


Тем не менее, он выглядит немного хакерским ^^
И он может работать не слишком хорошо, в зависимости от видастрока, которую вы получаете в качестве ввода ...

[Редактировать] Я только что видел ваш комментарий, где вы, кажется, указываете, что получаете JSON в качестве ввода?Если это так, json_decode() действительно может быть подходящим инструментом для работы; -)

3 голосов
/ 07 сентября 2016

Принятый ответ не сработает, если вы попытаетесь использовать код JSON где-то между выполнением страницы (например, в качестве плагина для некоторой CMS) или не сможете установить информацию заголовка. Но, конечно, заголовок страницы должен быть всегда установлен правильно.

Вы можете предоставить функции json_encode / json_decode дополнительные параметры, чтобы «заставить» ее использовать utf-8. Я создаю простой класс для этого и использую статические методы для получения моих результатов.

Ключом для этого является флаг JSON_UNESCAPED_UNICODE . Используйте это так:

Класс данных

/*
    Data Class
    * * * * * * *
    Encode and Decode Your String / Object / Array with utf-8 force.
*/
class Data {

    // Encode
    // @param $a  Array Element to decode in JSON
    public static function encode($a=[]){
        $json = json_encode($a, JSON_UNESCAPED_UNICODE);
        return $json;
    }

    // Decode
    // @param $a  JSON String
    // @param $t  Type of return (false = Array, true = Object)
    public static function decode($a='', $t=false){
        $obj = json_decode($a, $t, 512, JSON_UNESCAPED_UNICODE);
        return $obj;
    }
}

Использование

<code>// Get your JSON String
$some_json_string = file_get_contents(YOUR_URL);

// Decode as wish
$json_as_array    = Data::decode($some_json_string);
$json_as_object   = Data::decode($some_json_string, true);

// Debug / use your Content 
echo "<pre>";
print_r($json_as_array);
print_r($json_as_object);
echo "
";
...