2010-03-04 2 views
2

나는 악센트를 잘 얻을 수있는 진짜 문제가 있어요, 나는 내 경우에는,이 대부분의 라틴어로 발생할 수 있습니다 생각, 포르투갈어루비 문자열 악센트 오류 : 눈을

내가 가진 문자열을 만나는 것보다 더 많은 것을 매개 변수로 와서 나는 첫 번째 문자를 가져와 그것을 upcase해야합니다! 루비에서는 사소한 문제가 발생하지만 여기 잡기가 있습니다 :

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 

나는 그것을 일반적인 것으로 만들고 싶습니다.

난 그냥 사용하는 클래스 ../active_support/core_ext/string/multibyte.rb에서 볼 수 있듯이 레일 문자열이 멀티 바이트에 캐스트 할 수있는 것을 발견
[편집] : 아직도

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

, @nsdk 접근법은 사용하기가 더 쉽습니다.)

+0

mb_chars에 대한 정보는 솔루션입니다. 또한 비 Rails 응용 프로그램에서 Active Support 3의 멀티 바이트를 요구할 수 있습니다 (Sinatra 응용 프로그램 및 시스템 스크립트에서 항상 수행합니다). 자신의 질문에 답하고 @ nsdk가 아닌 정답으로 표시해야합니다. – mislav

답변

-1

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

+0

완벽하게 작동합니다. 덕분에 많이! –

+0

이것은 의미가 없습니다. – mislav

5

문자 á은 UTF-8 문자열로 단일 바이트로 표시되지 않지만 2 바이트 시퀀스 C3, A1으로 표시되지 않습니다. 따라서 문자열에서 [0,1]을 자르면 그 중 첫 번째 바이트 인 \C3 또는 \303 만 얻을 수 있습니다. 이는 의미가 없으므로 upcase입니다.

루비 1.8은 유니 코드를 사용하지 않으므로 바이트 문자열에 맞서 싸우고 국제적으로 인식되는 응용 프로그램을 작성하는 것과 같은 많은 문제가 발생합니다. 예를 들어보십시오. 일부 배경의 경우 this question 마침내 Ruby 1.9가이 문제를 해결합니다.

+0

이것은 문제의 좋은 설명이지만 솔루션을 제공하지 않습니다 (1.9로 전환 제외). – mislav