Solucionado (ver solução)
Solucionado
(ver solução)
10
respostas

Exibição de letras latinas

Estou tentando passar para o programa uma palavra ou frase que contém acentuação gráfica através do "gets" e o mesmo desconhece essas letras.

teste.rb:

# language: pt
# encoding UTF-8

text = "acentuação gráfica"
puts text
text = gets
puts text

Executando ruby teste.rb:

acentuação gráfica
acentuação gráfica   #gets
acentua��o gr�fica

Quando a acentuação é passada como uma variável dentro do código, executa sem problemas, mas quando é passado pelo teclado da problema.

Já tentei por varias soluções pela internet como:

ActiveSupport::Inflector.transliterate(text) #ou
I18n.transliterate(text) #ou
text.parameterize

que me devolveram "acentua??o gr?fica". Teve também outros métodos que me geraram o erro "invalid byte sequence in UTF-8 (ArgumentError)".

Alguém que já passou por isso consegue me ajudar?

10 respostas

Você usa um editor de texto (ex.: Notepad++, Sublime) ou uma IDE (Netbeans)?

No último caso, às vezes é preciso configurar o encoding do próprio console onde a saída vai ser exibida.

Caso isso não resolva, você pode tentar colocar a seguinte linha no código de configuração:

export LC_ALL=en_US.UTF-8

Fontes:

http://www.leidemer.com/blog/resolvendo-problemas-com-acentos-em-ruby/ http://www.guj.com.br/t/acentuacao-na-saida-do-ruby/283751/2

Estou usando Visual Studio Code e executando pelo Cmder

Gal, creio que o problema esteja no cmder. Pra resolver, roda o seguinte comando no cmder:

chcp utf8

Isso vai configurar o UTF-8 como padrão. Depois disso, roda o teu programa e a saída já deverá apresentar os acentos.

Caso o comando acima não funcione, roda:

chcp 65001 & cmd

Agora fiquei com espaço no lugar daqueles sinais

acentuação gráfica  
acentuação gráfica   #gets
acentua  o gr fica  

Tentou os dois comandos?

Se tentou com os dois, aí é possível que seja algo no código, uma vez que esses comandos tornam a exibição em UTF8 como a padrão.

ao tentar o "chcp utf8" ele me retorna:

Formato de parâmetro incorreto - utf8

o comando "chcp 65001 & cmd" me troca o prompt mesmo, mas quando executo o código:

acentuação gráfica  
acentuação gráfica   #gets
acentua  o gr fica 

o código é bem simples, do jeito que escrevi a cima. gostaria de saber se tem alguma classe que trata esse caso ou até substitui essas letras pelas "normais"? que a final só quero fazer uma comparação de valores, do texto escrito onde estou pesquisando com o texto de entrada pelo gets, e retornar um boolean.

Creio que não me expressei do jeito certo. O chcp 65001 tem que ir no código.

Ex.:

# encoding: utf-8
chcp 65001

text = "acentuação gráfica"
puts text
text = gets
puts text

A fonte que o console está usando também pode ser um problema. É importante que seja uma que suporte UNICODE, como Lucinda Console ou Consolas.

solução!

Quanto ao que você falou por último, entendi que letras normais seria o processo de tirar os acentos e exibir uma mensagem sem "caracteres especiais".

Nesse caso, existe o método transliterate que troca os caracteres especiais por suas versões sem acento. Caso você usasse esse método, funcionaria assim:

ActiveSupport::Inflector.transliterate('aäoöuü') 
# => "aaeooeuue"

Ou seja, todos os caracteres ali entre parênteses são substituídos. No teu caso, é só colocar o nome da variável.