char multibyte inválido (US-ASCII) com Rails e Ruby 1.9

197

Estou usando Ruby 1.9.1 com Rails 2.3.4 Meu aplicativo é para lidar com entrada de texto

Se eu tentar algo como (as aspas internas parecem diferentes)

text = "”“"

Estou tendo o erro a seguir:

#<SyntaxError: /Users/tammam56/rubydev/favquote/lib/daemons/twitter_quotes_fetch.rb:54: invalid multibyte char (US-ASCII)
/Users/tammam56/rubydev/favquote/lib/daemons/twitter_quotes_fetch.rb:54: invalid multibyte char (US-ASCII)
/Users/tammam56/rubydev/favquote/lib/daemons/twitter_quotes_fetch.rb:54: syntax error, unexpected $end, expecting keyword_end

Preciso usar essas aspas, pois os usuários podem inseri-las e eu tenho que dar conta disso.

Alguma ideia?

Tam
fonte
Se o seu código não possui nenhum backticks, mas você está sendo "acusado" de usar backticks, pode haver alguns problemas estranhos de espaçamento / guias / nova linha no seu arquivo. Tente publicá-lo em um StackOverflow em branco, por exemplo, e o SO começará a agir de maneira estranha. Remova os espaços e tabulações e novas linhas estranhas. Novamente, apenas colar o código em um espaço em branco e tentar formatar seu código para apresentação é uma maneira de dar uma dica a si mesmo.
precisa saber é o seguinte

Respostas:

691

Você tentou adicionar um comentário mágico no script em que você usa caracteres não ASCII? Deve ir no topo do script.

#!/bin/env ruby
# encoding: utf-8

Funcionou para mim como um encanto.

Jarek Zmudzinski
fonte
2
Hmm ......... adicionou isso ao topo do arquivo, mas ainda recebe a mesma mensagem de erro. Alguma sugestão?
Artem Kalinchuk 19/03/12
8
A explicação central pode ser encontrada no artigo @dalyons linked: os arquivos de origem recebem uma codificação US-ASCII, a menos que você diga o contrário. Se você colocar qualquer conteúdo não ASCII em um literal String sem alterar a codificação de origem, Ruby morrerá com esse erro. Valeu galera, finalmente consegui :-) #
-t-bass
2
#!/bin/env rubynão é necessário, a menos que você esteja executando o script na linha de comando como um executável. A # encodinglinha funciona por si só.
gak
10
# encoding: utf-8. É final de 2013 e ainda temos que jogar este jogo. Espere, telefone tocando ... Era 2033, eles ligaram para dizer que ainda tocavam. Oh bem, obrigado por me lembrar, Jarek Zmudzinski a partir de 2010.
thomax
1
@gotqn - Por favor, encontrar o mesmo artigo aqui - graysoftinc.com/character-encodings/...
Alok Swain
43

Se você deseja adicionar comentários mágicos em todos os arquivos de origem de um projeto com facilidade, use a magic_encodinggema

sudo gem install magic_encoding

basta ligar magic_encodingno terminal a partir da raiz do seu aplicativo.

Shamu
fonte
Eu acho que é importante lembrar desse tipo de detalhes, para não usar essa gema por pelo menos alguns meses escrevendo # encoding: utf-8 manualmente.
Marcel Valdez Orozco
A adição de 'gem magic_encoding' ao gemfile nos trilhos 2.3 e ruby ​​1.9 ajudou
Elmor 4/12
isso não se integra nos testes de pepino.
Viagem
1
@Elmor Você nunca deve colocar bibliotecas externas no Gemfile do seu projeto assim. magic_encodingé apenas uma ferramenta de linha de comando, não uma dependência do projeto.
Nowaker
17

Eu só quero adicionar minha solução:

eu uso tremas alemães como ö, ü, ä e obtive o mesmo erro.
@Jarek Zmudzinski acabou de lhe dizer como funciona, mas aqui está o meu:

Adicione este código à parte superior do seu controlador: # encoding: UTF-8
(por exemplo, para usar mensagens instantâneas com tremas)

exemplo do meu controlador:

# encoding: UTF-8
class UserController < ApplicationController

Agora você pode usar ö, ä, ü, ß, "" etc.

Ismoh
fonte
8

Essas aspas duplas inclinadas não são caracteres ASCII. A mensagem de erro é enganosa sobre eles serem 'multibyte'.

Phil Miller
fonte
2
Por que isso é enganoso? Eles são caracteres multibyte.
Matthew Scharley 16/11/2009
4
Porque o ASCII não define nenhuma codificação de vários bytes. Quanto ao ASCII, esses são sem sentido, que são válidos em uma codificação relacionada.
Phil Miller
8

Apenas observe que, a partir do Ruby 2.0, não há necessidade de adicionar # encoding: utf-8. UTF-8 é detectado automaticamente.

Nowaker
fonte
8

Isso funcionou para mim:

$ export LC_ALL=en_US.UTF-8
$ export LANG=en_US.UTF-8
cassioscabral
fonte