0

我必须将 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 数据库中。

有人知道我该怎么做吗?实现相同结果的更好方法也将不胜感激。

4

2 回答 2

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 的代码示例不押韵。

于 2013-01-28T17:38:32.667 回答
0

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

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

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

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

这里解释得很好: 如何将 Unicode 转义序列(如“\u00ed”)解码为正确的 UTF-8 编码字符?

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

我希望这可以帮助一些处于相同情况的人。尽管它很丑,但它确实有效。

于 2013-01-28T18:19:26.953 回答