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

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

例如,我有一个带有西里尔字符的字符串,所以当我使用string.upcase它不起作用。

Ruby仅支持字母AZaz上的大小写转换。

这样做的原因很简单,就是其他字母的转换没有明确定义。 例如,在土耳其语'I'.downcase # => 'ı''i'.upcase # => 'İ' ,但在法语中'I'.downcase # => 'i''i'.upcase # => 'I' 。 Ruby不仅要知道字符编码,还要知道正确执行该操作的语言。

更糟糕的是,用德语

 'MASSE'.downcase 

要么是

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

换句话说:你需要真正理解文本,即你需要一个完整的AI,才能正确地进行大小写转换。

而且我自己实际上偶然构造了一个句子, 即使对于一个人来说这也是不可判定

简而言之:它根本不可能正确完成,这就是Ruby根本不做的原因。 但是,有第三方库,如Unicode库和ActiveSupport,它们支持更大的字符子集。

rails 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 ?" 
 "ТЕКСТ".mb_chars.downcase # => "текст" 

不幸的是,由于其他post中描述的问题,Ruby 1.9中不支持downcase / upcase。 你仍然可以写自己的gem,这将增加对西里尔文的支持。 你可以看看我的gem波兰语 – 打开正确的盒子折叠就像这样简单:

 gem 'string_case_pl' 

它还为波兰语提供了正确的字符串排序。