Jump to content

IF dá sempre falso com caracteres acentuados


Recommended Posts

Olá!

Estou a aprender Ruby e deparei-me com um problema estranho. Quando tento comparar uma variável string a uma string que contenha caracteres acentuados, dá sempre falso:

# encoding: utf-8
puts "Nome?"
STDOUT.flush
nome = gets.chomp.to_s
puts "Olá José!" if nome == "José"

Versão do Ruby: 1.9.3p484

Se introduzo "José", a condição é sempre falsa. Só funciona se retirar o acento.

Alguém sabe como se soluciona? Obrigado.

Edited by news_js
Link to post
Share on other sites
brunoais

Qual é o character encode do ficheiro?

"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Link to post
Share on other sites

É suposto dar falso porque são caracteres diferentes e, consequentemente, strings diferentes. Se queres fazer uma comparação desse género, deves substituir os caracteres acentuados usando um regex (método gsub) ou gems (libraries) específicas para isso como o i18n ou o ActiveSupport.

Tens aqui alguns exemplos de como o fazer:

http://stackoverflow.com/questions/225471/how-do-i-replace-accented-latin-characters-in-ruby

Edited by PTutor

A autoridade em Flex/Actionscript

Link to post
Share on other sites

OK, obrigado, mas para já isso é muito complicado para mim. Ainda estou no "Olá Mundo!". Mais tarde volto a ler essa página.

Mas este problema com os caracteres já não devia estar resolvido nas modernas linguagens de programação? Isto acontece só com Ruby?

PS: Escrevi este pequeno programa para comparar João introduzido via teclado e João armazenado numa string:

# encoding: utf-8
puts "Nome?"
STDOUT.flush
nome = gets.chomp.to_s
conhecido = "João"
puts nome
puts nome.length
nome.each_byte.map do |b|
puts b
end
puts conhecido
puts conhecido.length
conhecido.each_byte.map do |b|
puts b
end

resultado.jpg

Ou seja, apesar de os dois "João" terem 4 carateres, o que foi introduzido via teclado, a variavel nome, tem 4 bytes e o que foi atribuido à variável conhecido tem 5 bytes. Porque é que isto acontece? Não são os mesmos carateres?

PS2: Já fiz esta tentativa, usando o método gsub para substituir "á" por "a":

# encoding: utf-8
STDOUT.flush
puts "Nome?"
nome = gets.chomp.to_s
nome=nome.gsub(/[á]/,"a")
puts nome

Mas deu este erro:

erro1.jpg

in `gsub': incompatible encoding regexp match <UTF-8 regexp with CP850 string> <Encoding::CompatibilityError>

Alguma solução para este erro?

Edited by news_js
Link to post
Share on other sites

Bom, depois de andar à voltas com isto, lá descobri que a string que é introduzida via teclado está codificada em CP850 (o que o Windows está a usar). Como solução provisória, bastou alterar a linha de código da entrada da variável nome para:

nome = gets.chomp.to_s.encode("utf-8")

Deve haver uma solução mais "global", mas fica para quando eu já não esteja na fase "Olá Mundo!".

Edited by news_js
  • Vote 1
Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.