Ruby String重音错误:不仅仅是满足眼睛

Fab*_*ani 2 ruby string ruby-on-rails character-encoding

我有一个真正的麻烦,以获得正确的口音,我相信这可能发生在大多数拉丁语言,在我的情况下,葡萄牙语

我有一个字符串作为参数,我必须得到第一个字母,并取消它!这在红宝石中应该是微不足道的,但这里有一个问题:

s1 = 'alow'; s1.size #=> 4
s2 = 'álow'; s2.size #=> 5

s1[0,1] #=> "a"
s2[0,1] #=> "\303"

s1[0,1].upcase #=> 'A'
s2[0,1].upcase #=> '\303' !!!

s1[0,1].upcase + s1[1,100] #=> "Alow" OK
s2[0,1].upcase + s2[1,100] #=> "álow" NOT OK
Run Code Online (Sandbox Code Playgroud)

我想把它变成通用的,有什么帮助吗?

[编辑]
我发现Rails字符串可以转换为多字节,如类./active_support/core_ext/string/multibyte.rb中所示,只需使用:

s2.mb_chars[0,1].upcase.to_s #=> "Á"
Run Code Online (Sandbox Code Playgroud)

仍然,@ nsdk方法更容易使用=)

bob*_*nce 5

该字符á在UTF-8字符串中不表示单个字节,而是在双字节序列C3中表示A1.因此,当你[0,1]从字符串切片时,你只得到它的第一个字节,\C3或者\303,你不能有意义upcase.

Ruby 1.8没有做Unicode,所以你要打击字节字符串并遇到很多问题,比如试图在其中编写具有国际意识的应用程序.见例如.这个问题有一些背景.Ruby 1.9最终解决了这个问题(虽然我不喜欢它的方法).