我必须将一个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 db中。
有人知道我是怎么做到的吗?一个更好的方法来完成同样的结果,也将是非常感谢的。
发布于 2013-01-28 09:38:32
您正在对一些不是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 db中。
与输入为utf8编码的JSON的代码示例不押韵。
发布于 2013-01-28 10:19:26
我有一个latin1编码数组。我必须将该数组编码为JSON,然后将该JSON存储在我的latin1 db中。我的第一个问题是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?
我对这个解决方案特别不满意,但我有最后期限。所以,如果有人有更好的方法,请和我分享。
我希望这能帮助一些处于同样情况的人。尽管它很丑,但它还是有效的。
https://stackoverflow.com/questions/14567741
复制