编码麻烦 - 一种格式到另一种格式

时间:2010-07-16 20:58:51

标签: php unicode encoding

我有一个刮刀正在从别处收集一些我无法控制的数据。源数据执行各种有趣的Unicode字符,但它将它们转换为非常无用的格式,所以

\u00e4

对于带有变音符号的小'a'(没有我认为应该在那里的双引号)*。当然这会在我的HTML中呈现为纯文本。

是否有任何现实的方法将unicode源转换为适当的字符,不涉及我手动处理每个字符串序列并在刮擦期间替换它们?

*这里是它吐出的json样本:

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

2 个答案:

答案 0 :(得分:6)

考虑到\ u00e4是Unicode字符的Javascript表示,可能是使用json_decode() PHP函数将其解码为PHP字符串......

有效的JSON字符串为:

$json = '"\u00e4"';

而且:

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

会给你正确的输出:

string 'ä' (length=2)

(这是一个字符,但长度为两个字节)


不过,感觉有点hackish ^^
它可能效果不好,取决于你输入的字符串类型......

[编辑] 我刚刚看到您的评论,您似乎表示您将JSON作为输入?如果是这样,json_decode()可能真的是适合这项工作的工具; - )

答案 1 :(得分:3)

如果您尝试在页面执行之间的某个位置使用JSON编码(例如,作为某些CMS的插件)或无法设置标题信息,则接受的答案将不起作用。但是,当然,页面标题应该始终正确设置。

您可以使用附加参数提供json_encode / json_decode函数以“强制”使用utf-8。我正在为此构建一个简单的类,并使用静态方法来获取结果。

关键是Flag 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;
    }
}

用法

// 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 "</pre>";