Rails ve Ruby 1.9 ile geçersiz çok baytlı karakter (US-ASCII)


197

Rails 2.3.4 ile Ruby 1.9.1 kullanıyorum Uygulamam metin girişini işlemek için

Eğer böyle bir şey denersem (iç tırnak işaretleri farklı görünür)

text = "”“"

Aşağıdaki hatayı alıyorum:

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

Kullanıcıların girebileceği gibi bu tırnak işaretlerini kullanmam gerekiyor ve bunu hesaba katmam gerekiyor mu?

Herhangi bir fikir?


Kodunuzda herhangi bir backtick yoksa ancak backticks kullanmakla "suçlanıyorsanız", dosyanızda bazı garip boşluklar / sekmeler / yeni satır sorunları olabilir. Örneğin bir StackOverflow boşuna göndermeyi deneyin, SO garip davranmaya başlayacaktır. Garip boşlukları, sekmeleri ve yeni satırları kaldırın. Yine, kodu bir SO boşluğuna yapıştırmak ve kodunuzu sunum için biçimlendirmeye çalışmak kendinize bir ipucu vermenin bir yoludur.
boulder_ruby

Yanıtlar:


691

ASCII olmayan karakterleri kullandığınız komut dosyasına sihirli bir yorum eklemeyi denediniz mi? Komut dosyasının üstüne gitmelidir.

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

Benim için bir cazibe gibi çalıştı.


2
Hmm ......... bunu dosyanın üstüne ekledi ama yine de aynı hata mesajını alıyorum. Baska öneri?
Artem Kalinchuk

8
Merkezi açıklama @dalyons bağlantılı makalesinde bulunabilir: aksi belirtilmedikçe kaynak dosyalar US-ASCII Kodlaması alır. Kaynak Kodlamasını değiştirmeden ASCII olmayan herhangi bir içeriği bir String değişmezine yerleştirirseniz, Ruby bu hatayla ölür. Teşekkürler çocuklar, nihayet anladım :-)
bass-t

2
#!/bin/env rubykomut dosyasını komut satırından yürütülebilir olarak çalıştırmadığınız sürece gerekli değildir. # encodingHat başına çalışır.
gak

10
# encoding: utf-8. 2013'ün sonları ve hala bu oyunu oynamak zorundayız. Bekle, telefon çalıyor ... 2033'tü, hala çaldığını söylemeye çağırdılar. Oh, hatırlattığın için teşekkürler, Jarek Zmudzinski 2010'dan.
thomax

1
@gotqn - Lütfen aynı makaleyi burada bulabilirsiniz - graysoftinc.com/character-encodings/…
Alok Swain

43

Kolayca bir projenin tüm kaynak dosyaları üzerinde sihirli yorum eklemek istiyorsanız, kullanabileceğiniz magic_encodingmücevher

sudo gem install magic_encoding

daha sonra magic_encodingterminali uygulamanızın kökünden arayın.


Ben bu tür ayrıntıları hatırlamak önemli olduğunu düşünüyorum, bu yüzden bu kod # kodlama yazma en az birkaç ay boyunca kullanmazdım: utf-8 elle.
Marcel Valdez Orozco

raylar 2.3 ve yakut 1.9 gemfile 'gem magic_encoding' ekleyerek yardımcı oldu
Elmor

bu salatalık testlerine entegre olmaz.
Yolculuk

1
@Elmor Projenizin Gemfile'ına asla böyle harici kütüphaneler koymamalısınız. magic_encodingyalnızca bir komut satırı aracıdır, proje bağımlılığı değildir.
Nowaker

17

Ben sadece çözümümü eklemek istiyorum:

ö, ü, ä gibi alman mızraplarını kullanıyorum ve aynı hatayı aldım.
@Jarek Zmudzinski size nasıl çalıştığını anlattı, ama işte benim:

Bu kodu Kontrolörünüzün üstüne ekleyin: # encoding: UTF-8
(örneğin, kısa mesajlarla flaş mesaj kullanmak için)

Denetleyicimin örneği:

# encoding: UTF-8
class UserController < ApplicationController

Artık ö, ä, ü, ß, "" vb.


8

Eğimli çift tırnak işaretleri ASCII karakterleri değildir. Hata iletisi 'çok baytlı' olmaları konusunda yanıltıcı.


2
Neden yanıltıcı? Bunlar şunlardır baytlı karakter.
Matthew Scharley

4
Çünkü ASCII herhangi bir çok baytlı kodlama tanımlamamaktadır. ASCII söz konusu olduğunda, bunlar ilgili kodlamada geçerli olan anlamsızdır.
Phil Miller

8

Ruby 2.0'dan itibaren eklemeye gerek olmadığını unutmayın # encoding: utf-8. UTF-8 otomatik olarak algılanır.


8

Bu benim için çalıştı:

$ export LC_ALL=en_US.UTF-8
$ export LANG=en_US.UTF-8
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.