Ошибка в акценте на Ruby String: больше, чем кажется на первый взгляд - PullRequest
2 голосов
/ 04 марта 2010

У меня реальная проблема с правильным акцентом, и я верю, что это может произойти с большинством латинских языков, в моем случае, португальского

У меня есть строка, которая приходит в качестве параметра, и я должен получить первую букву и прописать ее! Это должно быть тривиально в ruby, но вот подвох:

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

Я бы хотел сделать это универсальным. Любая помощь?

[EDIT]
Я обнаружил, что строки Rails могут быть преобразованы в мультибайты, как показано в классе ../active_support/core_ext/string/multibyte.rb, просто используя:

s2.mb_chars[0,1].upcase.to_s #=> "Á"

Тем не менее, подход @nsdk проще в использовании =)

Ответы [ 2 ]

5 голосов
/ 04 марта 2010

Символ á представлен не одним байтом в строках UTF-8, а двухбайтовой последовательностью C3, A1. Поэтому, когда вы выделяете [0,1] из строки, вы получаете только первый байт, \C3 или \303, который вы не можете осмысленно upcase.

Ruby 1.8 не поддерживает Unicode, так что вы будете бороться с байтовыми строками и столкнетесь с множеством подобных проблем, пытаясь писать в нем приложения, учитывающие международные стандарты. См. Например этот вопрос для некоторого фона. Ruby 1.9 наконец исправляет это (хотя мне не нравится его подход).

0 голосов
/ 04 марта 2010

s1.sub /^(.)/ do |char| char.upcase end

...