如何将“\ uxxxx”格式的utf8字符串转换为latin1?

时间:2013-01-28 17:31:20

标签: php encoding utf-8

我必须将一个JSON格式的字符串保存到我的latin1 mysql数据库中。为了能够使用uft8_encode函数,我必须将整个数组转换为utf8,然后将结果字符串转换回latin1。

所以我尝试了以下代码:

    // $context is equal to array('produção' => 'homologação'), for testing purposes
    $context = Helper::getHelper('Util')->encodeUtf8($context); // Encodes key and value with utf8_encode

    $context = json_encode($context); // {"produ\u00e7\u00e3o":"homologa\u00e7\u00e3o"}

    $context = utf8_decode($context); // Still {"produ\u00e7\u00e3o":"homologa\u00e7\u00e3o"}

但正如你所看到的,它只是没有像我预期的那样工作。我也尝试使用Zend_Json库,但它也不适用于那些字符。

简化:我需要将latin1数组编码为JSON,然后将该JSON插入我的latin1数据库。

有人知道我该怎么做吗?一个更好的方法来完成相同的结果也将非常感激。

2 个答案:

答案 0 :(得分:2)

您正在utf8_decode上执行utf8

JSON编码内容始终为ASCII,因此执行utf8_decode将不执行任何操作(ASCII是UTF8的子集)。您必须首先解码JSON。

正确的顺序是:

$string = "some UTF8 string";   // utf8
$json = json_encode($string); // json
$utf8 = json_decode($json); // utf8
$latin = utf8_decode($utf8); // latin1

当然,这里的JSON步骤是不必要的,但我猜你正在使用JSON来传输或存储你的数据(这是一个好主意!)。


由于您更新了问题:

JSON是ASCII,因此将其存储在latin1编码字段中应该没问题。

如果您希望将您的utf8编码数据作为latin1发送到客户端,那么您需要在将其放入数据库之前或拔出之后进行一些编码转换。

我的观点是,您不需要做任何技巧来将JSON存储在数据库中。这不应成为问题的一部分。在这一点上,我仍然不清楚你想要什么。声明:

  

简化:我需要将latin1数组编码为JSON,然后将该JSON插入我的latin1数据库。

与你的输入是(我假设)utf8编码的JSON的代码示例不押韵。

答案 1 :(得分:0)

我有一个latin1编码的数组。我必须将该数组编码为JSON,然后将该JSON存储在我的latin1数据库中。我的第一个问题是json_encode只接受utf8编码的数组,因此我必须将整个数组编码为utf8。

但真正的问题是我的数据库。当我插入JSON时,它会插入文字字符串,并带有一些“\ uxxxx”序列。我首先想到的只是utf8字符,所以我试着解码它们。显然,我错了。

@Frits解释说json_encode的结果是纯粹的ascii帮了我很多,让我看了不同的方向,我找到了解决问题的方法。

由于“\ uxxxx”序列只是ascii,我真正需要的是用正确的utf8字符替换这些序列,然后解码整个字符串。

这里有很好的解释: How to decode Unicode escape sequences like "\u00ed" to proper UTF-8 encoded characters?

我特别不满意这个解决方案,但我有一个截止日期。所以,如果有人有更好的方法,请与我分享。

我希望在同样的情况下帮助一些人。尽管它很丑陋,但它确实有效。