carattere multibyte non valido (US-ASCII) con Rails e Ruby 1.9


197

Sto usando Ruby 1.9.1 con Rails 2.3.4 La mia applicazione è gestire l'immissione di testo

Se provo qualcosa del genere (le virgolette interne sembrano diverse)

text = "”“"

Ottengo il seguente errore:

#<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

Devo utilizzare le virgolette perché gli utenti potrebbero inserirle e devo tenerne conto?

Qualche idea?


Se il tuo codice non contiene backtick ma sei "accusato" di usare backtick, potrebbero esserci strani problemi di spaziatura / tabs / newline nel tuo file. Prova a postarlo in uno spazio StackOverflow per esempio, e SO inizierà a comportarsi in modo strano. Rimuovi gli strani spazi, le schede e le nuove righe. Ancora una volta, incollare il codice in un SO vuoto e provare a formattare il codice per la presentazione è un modo per darti un suggerimento.
boulder_ruby,

Risposte:


691

Hai provato ad aggiungere un commento magico nello script in cui usi caratteri non ASCII? Dovrebbe andare in cima allo script.

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

Ha funzionato per me come un fascino.


2
Hmm ......... aggiunto questo nella parte superiore del file ma ottiene ancora lo stesso messaggio di errore. Eventuali suggerimenti?
Artem Kalinchuk,

8
La spiegazione centrale può essere trovata nell'articolo collegato @dalyons: i file di origine ricevono una codifica US-ASCII, se non diversamente specificato. Se si inserisce qualsiasi contenuto non ASCII in un valore letterale String senza modificare la codifica di origine, Ruby morirà con tale errore. Grazie ragazzi, ho finalmente capito :-)
bass-t

2
#!/bin/env rubynon è necessario a meno che non si stia eseguendo lo script dalla riga di comando come eseguibile. La # encodinglinea funziona da sola.
gak

10
# encoding: utf-8. È la fine del 2013 e dobbiamo ancora giocare a questo gioco. Aspetta, squilla il telefono ... Era il 2033, chiamarono per dire che lo suonavano ancora. Oh bene, grazie per avermelo ricordato, Jarek Zmudzinski del 2010.
Thom

1
@gotqn - Trova lo stesso articolo qui - graysoftinc.com/character-encodings/…
Alok Swain,

43

Se vuoi aggiungere facilmente commenti magici su tutti i file sorgente di un progetto, puoi usare la magic_encodinggemma

sudo gem install magic_encoding

quindi chiama magic_encodingil terminale dalla radice della tua app.


Penso che sia importante ricordare questo tipo di dettagli, quindi non userei quella gemma per almeno alcuni mesi scrivendo # encoding: utf-8 manualmente.
Marcel Valdez Orozco,

l'aggiunta di 'gem magic_encoding' al gemfile su rotaie 2.3 e ruby ​​1.9 ha aiutato
Elmor

questo non si integra nei test sui cetrioli.
Viaggio del

1
@Elmor Non dovresti mai mettere librerie esterne nel Gemfile del tuo progetto in quel modo. magic_encodingè solo uno strumento da riga di comando, non una dipendenza del progetto.
Nowaker,

17

Voglio solo aggiungere la mia soluzione:

uso le umlaut tedesche come ö, ü, ä e ho avuto lo stesso errore.
@Jarek Zmudzinski ti ha appena detto come funziona, ma ecco il mio:

Aggiungi questo codice nella parte superiore del controller: # encoding: UTF-8
(ad esempio per utilizzare il messaggio flash con umlaut)

esempio del mio controller:

# encoding: UTF-8
class UserController < ApplicationController

Ora puoi usare ö, ä, ü, ß, "", ecc.


8

Quelle virgolette doppie inclinate non sono caratteri ASCII. Il messaggio di errore è fuorviante in quanto "multi-byte".


2
Perché è fuorviante? Essi sono caratteri multibyte.
Matthew Scharley,

4
Perché ASCII non definisce alcuna codifica multi-byte. Per quanto riguarda ASCII, quelli sono incomprensibili, ciò sembra essere valido in una codifica correlata.
Phil Miller,

8

Solo una nota che a partire da Ruby 2.0 non è necessario aggiungere # encoding: utf-8. UTF-8 viene rilevato automaticamente.


8

Ha funzionato per me:

$ export LC_ALL=en_US.UTF-8
$ export LANG=en_US.UTF-8
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.