如何在Rails中将文本转换为Unicode?

3
在我的数据库中,我有以下条目。
id     |      name      |      info
1          John Smith         Çö ¿¬¼

就像你所看到的那样,信息栏显示的是错误的 -- 它实际上是韩文。 在 Chrome 中,当我将浏览器编码从 UTF-8 切换到韩文('euc-kr',我想),我实际上可以查看此文本:

id     |      name      |      info
1          John Smith        횉철 쩔짭쩌

我随后手动将文本复制到数据库中的信息中并保存,现在我可以在UTF-8中查看它,而无需切换浏览器的编码。

太棒了。现在我想在Rails中完成同样的事情,而不是手动完成。因此,从原始条目开始,我进入控制台并键入:

require 'iconv'
u = User.find(1)
info = u.info
new_info = Iconv.iconv('euc-kr','UTF-8', info)
u.update_attribute('info', new_info)

然而,我最终得到的是类似于数据库中的\x{A2AF}\x{A8FA}\x{A1C6} \x{A2A5}\x{A8A2},而不是횉철 쩔짭쩌
我对Unicode和编码只有非常基本的理解。
请问有人能够解释一下这里发生了什么以及如何解决这个问题吗?我手动实现了所需的结果。
谢谢!
2个回答

4

哇,我现在感到很自责。经过几个小时的尝试解决问题后,我终于在发布了一个问题后的几分钟内自己找到了答案。

解决方案包括三个简单的步骤:

第一步:

我几乎做对了。我不应该将euc-kr转换为utf-8,而应该反过来,如下所示:

Iconv.iconv('UTF-8', 'euc-kr', info)

步骤2:

在进行文本转换时,可能会遇到一些错误,为了保险起见,我告诉Iconv忽略任何错误:

Iconv.iconv('UTF-8//IGNORE', 'euc-kr', info)

最终,我真正得到了韩文文本,耶!问题在于,当我尝试将其插入数据库时,仍然会插入类似以下内容的东西:

UPDATE `users` SET `info` = '--- \n- \"\\xEC\\xB2\\xA0\\xEC\\xB1\\x8C...' etc...

虽然结果显示我有正确的文本。但是为什么呢?进入最后一步。

第三步:

原来 Iconv 的输出是一个数组。所以,我们使用 join 将它合并:

Iconv.iconv('UTF-8//IGNORE', 'euc-kr', info).join

这真的起作用了!

最终代码:

require 'iconv'
u = User.find(1)
info = u.info
new_info = Iconv.iconv('UTF-8//IGNORE','euc-kr', info).join
u.update_attribute('info', new_info)

希望这篇文章能够帮助看到它的人(包括我自己,未来的我)。

1
你实际上需要将编码从euc-kr转换为UTF-8,可以参考Iconv文档,但需要注意它们的代码顺序是相反的,不知道为什么这样设计。我曾经因为混淆了这一点而遇到过错误。 - asaaki

0
为什么要使用Iconv进行转换呢? 首先,如果您在数据库中看到了正确的样式,您应该确保数据库的字符集是utf8。 在脚本方面,您只需保存韩文值,而不使用Iconv。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接