我有一堆特殊字符的字符串。这有效:
myString.upcase.tr('æ-ý','Æ-Ý')
但是,它实际上并不适用于跨平台。我在Windows上的Ruby实现不会与此一致(在我的Mac和Linux机器上,就像魅力一样)。任何指针/解决方法/解决方案,真的很感激!
答案 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
的大写变体为I
,I
的小写变体为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)更加兼容!