2010-12-11 59 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' 

它还提供适当的字符串排序波兰。