如何将“uxxxx”格式的 utf8 字符串转换为拉丁语 1


How do I convert an utf8 string in "uxxxx" format to latin1?

我必须将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 编码字符?

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

我希望这对一些处于同样情况的人有所帮助。尽管它很丑陋,但它有效。