multibyte char yang tidak valid (AS-ASCII) dengan Rails dan Ruby 1.9

197

Saya menggunakan Ruby 1.9.1 dengan Rails 2.3.4 Aplikasi saya adalah untuk menangani input teks

Jika saya mencoba sesuatu seperti (tanda kutip di dalam terlihat berbeda)

text = "”“"

Saya mendapatkan kesalahan berikut:

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

Saya perlu menggunakan tanda kutip tersebut karena pengguna dapat memasukkannya dan saya harus menjelaskannya?

Ada ide?

Tam
sumber
Jika kode Anda tidak memiliki backticks di dalamnya tetapi Anda "dituduh" menggunakan backticks, mungkin ada beberapa masalah spasi / tab / baris baru yang aneh dalam file Anda. Cobalah mempostingnya ke dalam StackOverflow blank misalnya, dan SO akan mulai bertingkah aneh. Hapus spasi aneh dan tab dan baris baru. Sekali lagi, hanya menempelkan kode ke dalam SO kosong dan mencoba memformat kode Anda untuk presentasi adalah salah satu cara untuk memberi diri Anda petunjuk.
boulder_ruby

Jawaban:

691

Sudahkah Anda mencoba menambahkan komentar ajaib di skrip tempat Anda menggunakan karakter non-ASCII? Itu harus pergi di atas skrip.

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

Itu bekerja untuk saya seperti pesona.

Jarek Zmudzinski
sumber
2
Hmm ......... menambahkan itu ke atas file tetapi masih mendapatkan pesan kesalahan yang sama. Ada saran?
Artem Kalinchuk
8
Penjelasan pusat dapat ditemukan di artikel @dalyons tertaut: file sumber menerima Encoding US-ASCII, kecuali Anda mengatakan sebaliknya. Jika Anda menempatkan konten non-ASCII dalam string literal tanpa mengubah sumber Encoding, Ruby akan mati dengan kesalahan itu. Terima kasih teman-teman, akhirnya saya mendapatkannya :-)
bass-t
2
#!/bin/env rubytidak perlu kecuali Anda menjalankan skrip dari baris perintah sebagai yang dapat dieksekusi. The # encodinggaris bekerja dengan sendirinya.
gak
10
# encoding: utf-8. Ini akhir tahun 2013 dan kami masih harus memainkan game ini. Tunggu, telepon berdering ... Saat itu tahun 2033, mereka menelepon untuk mengatakan bahwa mereka masih memainkannya. Oh well, terima kasih sudah mengingatkan saya, Jarek Zmudzinski dari 2010.
thomax
1
@ gotqn - Silakan temukan artikel yang sama di sini - graysoftinc.com/character-encodings/…
Alok Swain
43

Jika Anda ingin menambahkan komentar ajaib pada semua file sumber proyek dengan mudah, Anda dapat menggunakan magic_encodingpermata

sudo gem install magic_encoding

lalu panggil saja magic_encodingterminal dari root aplikasi Anda.

Shamu
sumber
Saya pikir penting untuk mengingat detail seperti ini, jadi saya tidak akan menggunakan permata itu untuk setidaknya beberapa bulan menulis # encoding: utf-8 secara manual.
Marcel Valdez Orozco
menambahkan 'gem magic_encoding' ke gemfile on rails 2.3 & ruby ​​1.9 membantu
Elmor
ini tidak diintegrasikan ke dalam tes mentimun.
Perjalanan
1
@ Ellmor Anda tidak boleh meletakkan perpustakaan eksternal ke Gemfile proyek Anda seperti itu. magic_encodinghanyalah alat baris perintah, bukan ketergantungan proyek.
Sekarang
17

Saya hanya ingin menambahkan solusi:

Saya menggunakan umlaut Jerman seperti ö, ü, ä dan mendapatkan kesalahan yang sama.
@ Jarek Zmudzinski baru saja memberi tahu Anda cara kerjanya, tapi ini milik saya:

Tambahkan kode ini ke bagian atas Pengontrol Anda: # encoding: UTF-8
(misalnya untuk menggunakan pesan kilat dengan umlaut)

contoh Pengontrol saya:

# encoding: UTF-8
class UserController < ApplicationController

Sekarang Anda dapat menggunakan ö, ä, ü, ß, "", dll.

Ismoh
sumber
8

Kutipan ganda miring itu bukan karakter ASCII. Pesan kesalahan menyesatkan tentang mereka yang 'multi-byte'.

Phil Miller
sumber
2
Mengapa itu menyesatkan? Mereka adalah karakter multibyte.
Matthew Scharley
4
Karena ASCII tidak mendefinisikan pengkodean multi-byte. Adapun ASCII yang bersangkutan, itu adalah omong kosong, yang kebetulan valid dalam pengkodean terkait.
Phil Miller
8

Hanya perhatikan bahwa pada Ruby 2.0 tidak perlu menambahkan # encoding: utf-8. UTF-8 terdeteksi secara otomatis.

Pembuat sekarang
sumber
8

Itu berhasil bagi saya:

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