niepoprawny znak wielobajtowy (US-ASCII) w Railsach i Ruby 1.9


197

Używam Ruby 1.9.1 z Railsami 2.3.4 Moja aplikacja obsługuje przetwarzanie tekstu

Jeśli spróbuję czegoś takiego (znaki cudzysłowu wyglądają inaczej)

text = "”“"

Otrzymuję następujący błąd:

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

Muszę użyć tych znaków cudzysłowu, ponieważ użytkownicy mogą je wprowadzać i muszę to uwzględnić?

Jakieś pomysły?


Jeśli w kodzie nie ma żadnych znaków wstecznych, ale jesteś „oskarżany” o użycie znaków wstecznych, mogą występować dziwne problemy z odstępami / tabulacjami / znakiem nowej linii. Spróbuj opublikować go na przykład w polu StackOverflow, a SO zacznie działać dziwnie. Usuń dziwne spacje, tabulatory i znaki nowej linii. Ponownie, wklejenie kodu do SO-blank i próba sformatowania kodu do prezentacji to jeden ze sposobów na uzyskanie podpowiedzi.
boulder_ruby

Odpowiedzi:


691

Czy próbowałeś dodać magiczny komentarz w skrypcie, w którym używasz znaków spoza ASCII? Powinien być na górze skryptu.

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

To działało dla mnie jak urok.


2
Hmm ......... dodał to na początku pliku, ale wciąż pojawia się ten sam komunikat o błędzie. Jakieś sugestie?
Artem Kalinchuk

8
Centralne wyjaśnienie można znaleźć w artykule @dalyons link: pliki źródłowe otrzymują kodowanie US-ASCII, chyba że powiesz inaczej. Jeśli umieścisz dowolną zawartość inną niż ASCII w literale String bez zmiany kodowania źródłowego, Ruby umrze z powodu tego błędu. Dzięki chłopaki, w końcu to dostałem :-)
bas-t

2
#!/bin/env rubynie jest konieczne, chyba że uruchamiasz skrypt z wiersza poleceń jako plik wykonywalny. # encodingLinia działa sama.
gak

10
# encoding: utf-8. Jest koniec 2013 roku i nadal musimy grać w tę grę. Poczekaj, dzwoni telefon ... To był 2033, zadzwonili, żeby powiedzieć, że wciąż w to grają. No cóż, dzięki za przypomnienie, Jarek Żmudziński z 2010 roku.
thomax

1
@gotqn - Proszę znaleźć ten sam artykuł tutaj - graysoftinc.com/character-encodings/…
Alok Swain

43

Jeśli chcesz łatwo dodawać magiczne komentarze do wszystkich plików źródłowych projektu, możesz użyć magic_encodingklejnotu

sudo gem install magic_encoding

a następnie po prostu zadzwoń magic_encodingdo terminalu z katalogu głównego aplikacji.


Myślę, że ważne jest, aby pamiętać tego rodzaju szczegóły, więc nie używałbym tego klejnotu przez co najmniej kilka miesięcy pisania # kodowania: utf-8 ręcznie.
Marcel Valdez Orozco

dodanie „gem magic_encoding” do gemfile na szynach 2.3 i Ruby 1.9 pomogło
Elmor

nie integruje się to z testami ogórków.
Wycieczka

1
@Elmor Nigdy nie należy umieszczać zewnętrznych bibliotek w pliku Gemfile swojego projektu w ten sposób. magic_encodingto tylko narzędzie wiersza polecenia, a nie zależność od projektu.
Nowaker

17

Chcę tylko dodać moje rozwiązanie:

używam niemieckich umlautów takich jak ö, ü, ä i mam ten sam błąd.
@Jarek Żmudziński właśnie powiedział ci, jak to działa, ale oto mój:

Dodaj ten kod na górze kontrolera: # encoding: UTF-8
(na przykład, aby użyć wiadomości flash z umlautami)

przykład mojego kontrolera:

# encoding: UTF-8
class UserController < ApplicationController

Teraz możesz używać ö, ä, ü, ß, „” itp.


8

Te ukośne podwójne cudzysłowy nie są znakami ASCII. Komunikat o błędzie wprowadza w błąd, ponieważ są one „wielobajtowe”.


2
Dlaczego wprowadza w błąd? Są to znaki wielobajtowe.
Matthew Scharley

4
Ponieważ ASCII nie definiuje kodowania wielobajtowego. Jeśli chodzi o ASCII, są to bełkoty, które są prawidłowe w powiązanym kodowaniu.
Phil Miller,

8

Tylko uwaga, że ​​od Ruby 2.0 nie trzeba dodawać # encoding: utf-8. UTF-8 jest wykrywany automatycznie.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.