2010-12-11 53 views
2

如何在UTF-8字符上使用字符串方法?如何在UTF-8字符上使用字符串方法?

例如,我有一個西里爾字符的字符串,所以當我使用string.upcase它不起作用。

+0

如果你使用1.8或1.9,請告訴我們,行爲顯著在1.9與關於編碼處理改變。在1.8字符串是字節數組,在1.9它們是字符數組。 – Theo 2010-12-11 20:33:22

回答

7

欄杆active_support gem有可以處理這個的字符串擴展。

例如:

# $ sudo gem install activesupport 
require 'active_support/core_ext/string' 
'Laurent, où sont les tests ?'.mb_chars.upcase.to_s 
# outputs => "LAURENT, OÙ SONT LES TESTS ?" 
+0

這並不是一個西裏爾字母 工作提出 「ТОВАЕТЕСТ」 .downcase => 「ТОВАЕТЕСТ」 – 2011-04-13 18:54:45

8

紅寶石只支持上的字母AZaz的情況下的轉換。

原因很簡單,其他字母的大小寫轉換沒有很好的定義。例如,土耳其語'I'.downcase # => 'ı''i'.upcase # => 'İ',但法文'I'.downcase # => 'i''i'.upcase # => 'I'。 Ruby不僅需要知道字符編碼,還需要知道正確的語言。

更糟糕的是,在德國

'MASSE'.downcase 

要麼

'maße' # "measurements" 
'masse' # "mass" 

換句話說:你需要真正瞭解文本,即你需要一個全面的AI,正確執行案例轉換。

而且我自己實際上意外地構造了一次句子,即使對於人類也是不可判定的

簡而言之:這是不可能做到的,這就是爲什麼Ruby不這樣做在所有。有第三方庫,但是,像Unicode的圖書館和的ActiveSupport,這支持字符稍大的子集。

+0

甲苯基cevap,約爾格。 – 2014-10-31 14:16:57

0
"ТЕКСТ".mb_chars.downcase # => "текст" 
0

不幸的是,在Ruby 1.9中不支持downcase/upcase,因爲其他帖子中描述的問題。你仍然可以寫你自己的寶石,這將增加對西里爾文的支持。你可以看一下我的gem for Polish - 打開正確的情況下,摺疊一樣簡單:

gem 'string_case_pl' 

它還提供適當的字符串排序波蘭。