特殊字符大写

时间:2015-05-13 10:12:03

标签: ruby windows

我有一堆特殊字符的字符串。这有效:

myString.upcase.tr('æ-ý','Æ-Ý')

但是,它实际上并不适用于跨平台。我在Windows上的Ruby实现不会与此一致(在我的Mac和Linux机器上,就像魅力一样)。任何指针/解决方法/解决方案,真的很感激!

2 个答案:

答案 0 :(得分:4)

如果您使用 Rails> = 3 ,请尝试使用mb_chars方法。例如,

 'æ-ý'.mb_chars.upcase

 => "Æ-Ý"

如果您不使用Rails ,请尝试unicode gem。

 Unicode::upcase('æ-ý')

或者您也可以覆盖String类方法:

require "unicode";
class String
   def downcase
     Unicode::downcase(self)
   end
   def downcase!
     self.replace downcase
   end
   def upcase
     Unicode::upcase(self)
   end
   def upcase!
     self.replace upcase
   end
   def capitalize
     Unicode::capitalize(self)
   end
   def capitalize!
     self.replace capitalize
   end
end 

答案 1 :(得分:2)

不幸的是,如果不知道语言就不可能正确地升级/缩写字符串,在某些情况下甚至是字符串的内容。

例如,在英语中,i的大写变体为II的小写变体为i,但在土耳其语中为{{1}的大写变体{}为iİ的小写变体为I。在德语中,ı的大写变体是ß,但SS的大写变体也是ss,所以要小写,你需要理解文本,因为例如MASSE可能会降级为masse(质量)或maße(度量)。

Ruby采用简单的方法,只是在ASCII字母表中只有大写/下行。

但是,这只能解释为什么您的解决方法需要,而不是为什么它有时会起作用,有时却不起作用。如果您在所有平台上使用相同的Ruby版本和相同的Ruby实现以及相同版本的实现,那么应该工作。 YARV没有太多使用底层平台的字符串操作例程(对于大多数Ruby实现也是如此,实际上,即使JRuby不使用Java强大的字符串库,但为了最大程度的兼容性而自行滚动),它也没有使用除Onigmo之外的任何第三方库(例如ICU),因此平台差异不太可能受到责备。不同版本的Ruby使用不同版本的Unicode字符数据库(例如,我认为它至少在1.9和2.2之间的某处更新过一次),所以如果你的版本不匹配,可能会解释它。

或者,它可能是Windows上YARV的真正错误。也许试试JRuby?它往往在平台之间更加一致,事实上,在Windows上,它与Ruby的兼容性比Ruby(即YARV)更加兼容!