我必须将JSON格式的字符串保存到我的latin1 mysql db中。为了能够使用 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。
有人知道我该怎么做吗?实现相同结果的更好方法也将不胜感激。
您正在对不utf8
的东西执行utf8_decode
。
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 的代码示例不押韵。
我有一个拉丁1编码数组。我必须将该数组编码为 JSON,然后将该 JSON 存储在我的 latin1 db 中。我的第一个问题是json_encode只接受 utf8 编码的数组,所以我不得不将整个数组编码为 utf8。
但真正的问题是我的数据库。当我插入 JSON 时,它会插入文字字符串,带有一些"''uxxxx"序列。我最初认为这些只是utf8字符,所以我试图解码它们。显然,我错了。
@Frits解释说json_encode的结果是纯ASCII,这对我帮助很大,让我看到了不同的方向,我找到了解决问题的方法。
由于"''uxxxx"序列只是ascii,我真正需要的是用正确的utf8字符替换这些序列,然后解码整个字符串。
这里解释得很好:如何将 Unicode 转义序列(如"''u00ed")解码为正确的 UTF-8 编码字符?
我对这个解决方案特别不满意,但我有一个截止日期。所以,如果有人有更好的方法,请与我分享。
我希望这对一些处于同样情况的人有所帮助。尽管它很丑陋,但它有效。