2012-03-23 45 views
3

我想将“HELLO”转换为“HELLO”,删除所有导致问题的特殊字符插入到数据库中。它们似乎不属于UTF8。如何处理Ruby中的“”字符

我想弄清楚Iconv,但我那种坚持在这里:

str = "A string with " to "A string with " 
some_format = "I have no clue what format this is" 
Iconv.conv(some_format, 'UTF-8//IGNORE', str) 

这样做:

Iconv.conv('UTF-16', 'UTF-8//IGNORE', str) 

... ...回报

\376\377\000H\000E\000L\000L\000O?G?`?`?`?`?`?`?`?`?`?`?`?`?`?`?`?`?`?`?`?`?`?`?`?`?`?`?????\342 

我不想转换为UTF8以外的东西,因为我必须处理阿拉伯字符,中文,日文,韩文......

任何帮助/指针,将不胜感激。我使用的是Ruby 1.8.7,但我很快就会迁移到1.9.3。一种适用于这两种情况的解决方案是最好的,但只有1.9.3的解决方案也不错。

+0

这些“字符”来自哪里?如果它们“不是utf-8的一部分”(我甚至不确定它是否有意义),当它们得到它们时它们是什么编码? – geoffspear 2012-03-23 10:24:32

+0

@Wooble:它们来自用户输入。我不确定他们应该是什么。由于UTF-16是有意义的,所以它可以用于http://en.wikipedia.org/wiki/UTF-16 – marcgg 2012-03-23 10:26:37

+0

,但UTF-8和UTF-16只是unicode字符集的编码。如果一个字形在unicode中存在,它可以用任何一种编码表示。我猜你真正拥有的不是字符,而是一些未知编码中的字节。你必须确保在从用户那里得到输入时,你知道他们正在发送什么编码。 – geoffspear 2012-03-23 10:34:08

回答

4

这里有一个方法(将字符串转换为另一种编码时),以去除特定的编码不存在字符

# -*- coding: utf-8 -*- 
a = "⚒og" 
p a => ⚒og 
p a.encode('iso-8859-1', :undef => :replace, :replace => '') => og 

但是你的问题可能会有所不同。因为这些有问题的字符不太可能不属于utf-8。 可能出现的问题:

  1. 也许这只是您使用的字体不知道如何显示这些字符。很少有字体具有完整的utf-8字符覆盖率。 我不知道如何尝试显示这些字符串,但确保您使用的字体覆盖面很好。像DejaVu例如,http://dejavu-fonts.org/wiki/Main_Page

  2. 你确定你的数据库已正确配置为使用utf-8吗?

  3. 另外要小心,因为你的字符串可能是完全正常的,但由于utf-8支持不完整(在我之前发生过),所以在终端或数据库应用程序中没有显示。所以有时候当你的调试显示器被窃听时调试会变得棘手...(这是否合理?)