2012-03-23 44 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支持不完整(在我之前發生過),所以在終端或數據庫應用程序中沒有顯示。所以有時候當你的調試顯示器被竊聽時調試會變得棘手...(這是否合理?)