char đa bào không hợp lệ (US-ASCII) với Rails và Ruby 1.9


197

Tôi đang sử dụng Ruby 1.9.1 với Rails 2.3.4 Ứng dụng của tôi là xử lý nhập văn bản

Nếu tôi thử một cái gì đó như (dấu ngoặc kép bên trong trông khác)

text = "”“"

Tôi nhận được lỗi sau đây:

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

Tôi cần sử dụng các dấu ngoặc kép đó vì người dùng có thể nhập chúng và tôi phải tính đến điều đó?

Có ý kiến ​​gì không?


Nếu mã của bạn không có bất kỳ backticks nào trong đó nhưng bạn đang bị "buộc tội" sử dụng backticks, có thể có một số vấn đề về khoảng cách / tab / dòng mới lạ trong tệp của bạn. Ví dụ, hãy thử đăng nó vào một ngăn xếp StackOverflow và SO sẽ bắt đầu hành động kỳ lạ. Loại bỏ các không gian lạ và các tab và dòng mới. Một lần nữa, chỉ cần dán mã vào một chỗ trống SO và cố gắng định dạng mã của bạn để trình bày là một cách để cho bạn một gợi ý.
boulder_ruby

Câu trả lời:


691

Bạn đã thử thêm một nhận xét ma thuật trong kịch bản nơi bạn sử dụng các ký tự không phải ASCII chưa? Nó nên đi trên đầu của kịch bản.

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

Nó làm việc cho tôi như một lá bùa.


2
Hmm ......... đã thêm nó vào đầu tệp nhưng vẫn nhận được thông báo lỗi tương tự. Bất kỳ đề xuất?
Artem Kalinchuk

8
Có thể tìm thấy lời giải thích trung tâm trong bài viết @dalyons được liên kết: các tệp nguồn nhận được Mã hóa US-ASCII, trừ khi bạn nói khác. Nếu bạn đặt bất kỳ nội dung không phải ASCII nào trong một chuỗi ký tự mà không thay đổi Mã hóa nguồn, Ruby sẽ chết với lỗi đó. Cảm ơn các bạn, cuối cùng tôi đã hiểu :-)
bass-t

2
#!/bin/env rubykhông cần thiết trừ khi bạn đang chạy tập lệnh từ dòng lệnh dưới dạng thực thi. Các # encodingdòng hoạt động của chính nó.
gak

10
# encoding: utf-8. Cuối năm 2013 và chúng tôi vẫn phải chơi trò chơi này. Đợi đã, điện thoại reo ... Đó là năm 2033, họ gọi để nói rằng họ vẫn chơi nó. Ồ, cảm ơn vì đã nhắc nhở tôi, Jarek Zmudzinski từ năm 2010
thomax

1
@gotqn - Vui lòng tìm cùng một bài viết ở đây - graysoftinc.com/character-encodings/iêu
Alok Swain

43

Nếu bạn muốn thêm nhận xét ma thuật vào tất cả các tệp nguồn của dự án một cách dễ dàng, bạn có thể sử dụng magic_encodingđá quý

sudo gem install magic_encoding

sau đó chỉ cần gọi magic_encodingtrong thiết bị đầu cuối từ thư mục gốc của ứng dụng của bạn.


Tôi nghĩ điều quan trọng là phải nhớ loại chi tiết này, vì vậy tôi sẽ không sử dụng viên ngọc đó trong ít nhất vài tháng để viết # mã hóa: utf-8 theo cách thủ công.
Marcel Valdez Orozco

thêm 'gem magic_encoding' vào gemfile trên đường ray 2.3 & ruby ​​1.9 đã giúp
Elmor

Điều này không tích hợp vào các bài kiểm tra dưa chuột.
Chuyến đi

1
@Elmor Bạn không bao giờ nên đặt các thư viện bên ngoài vào Gemfile của dự án của bạn như thế. magic_encodingchỉ là một công cụ dòng lệnh, không phải là một phụ thuộc dự án.
Bây giờ là

17

Tôi chỉ muốn thêm giải pháp của mình:

Tôi sử dụng các âm sắc tiếng Đức như ö, ü, ä và có cùng một lỗi.
@Jarek Zmudzinski chỉ cho bạn biết nó hoạt động như thế nào, nhưng đây là của tôi:

Thêm mã này vào đầu Trình điều khiển của bạn: # encoding: UTF-8
(ví dụ: để sử dụng tin nhắn flash có âm sắc)

ví dụ về Trình điều khiển của tôi:

# encoding: UTF-8
class UserController < ApplicationController

Bây giờ bạn có thể sử dụng ö, ä, ü, ß, "", v.v.


8

Những dấu ngoặc kép nghiêng không phải là ký tự ASCII. Thông báo lỗi gây hiểu nhầm về việc chúng là 'nhiều byte'.


2
Tại sao nó gây hiểu nhầm? Họ là những nhân vật đa nhân.
Matthew Scharley

4
Bởi vì ASCII không định nghĩa bất kỳ mã hóa nhiều byte nào. Đối với ASCII có liên quan, những điều đó là vô nghĩa, điều đó có hiệu lực trong một mã hóa liên quan.
Phil Miller

8

Chỉ cần lưu ý rằng kể từ Ruby 2.0, không cần thêm # encoding: utf-8. UTF-8 được tự động phát hiện.


8

Điều đó làm việc cho tôi:

$ export LC_ALL=en_US.UTF-8
$ export LANG=en_US.UTF-8
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.