2010-07-20 12 views
32

Tôi có một dự án Rails với rất nhiều chuỗi Cyrillic trong đó.Làm cách nào để tránh đặt nhận xét mã hóa ma thuật lên trên mọi tệp UTF-8 trong Ruby 1.9?

Nó hoạt động tốt trên Ruby 1.8, nhưng Ruby 1.9 giả định tệp nguồn là mã hóa US-ASCII trừ khi bạn cung cấp chú thích # encoding: utf-8 ở đầu tệp nguồn. Tại thời điểm đó các tập tin không được coi là US-ASCII.

Có cách nào đơn giản hơn để nói với Ruby "Ứng dụng này được mã hóa UTF8. Vui lòng xem xét tất cả và mọi tệp nguồn được bao gồm UTF8 trừ khi được khai báo khác"?


UPDATE:

tôi đã viết "How to insert the encoding: UTF-8 directive automatically in Ruby 1.9 files" mà gắn thêm các chỉ mã hóa tự động nếu nó cần thiết.

+2

James Gray đã viết [một loạt bài viết] (http://blog.grayproductions.net/articles/the_unicode_character_set_and_encodings) xử lý Unicode và Ruby. Xử lý tệp nguồn là một phần của chuỗi đó. Đó là đọc tốt. –

+0

5 năm sau: Nâng cấp lên ruby ​​2.0+, nơi mặc định là UTF-8 (https://www.ruby-lang.org/en/news/2013/02/24/ruby-2-0-0-p0- được phát hành /) –

Trả lời

5

Rõ ràng là tốt hơn là ẩn. Viết tên mã hóa là tốt cho trình soạn thảo văn bản, thông dịch viên của bạn và bất kỳ ai muốn xem tệp. Các nền tảng khác nhau có các giá trị mặc định khác nhau - UTF-8, Windows-1252, Windows-1251, v.v. - và bạn sẽ cản trở tính di động hoặc tích hợp nền tảng nếu bạn tự động chọn một nền tảng khác. Yêu cầu mã hóa rõ ràng hơn là một điều tốt.

Có thể là một ý tưởng hay để tích hợp ứng dụng Rails của bạn với GetText. Sau đó, tất cả các chuỗi UTF-8 của bạn sẽ được phân tách thành một số lượng nhỏ các tệp dịch và các mô-đun Ruby của bạn sẽ được làm sạch ASCII.

+0

+1 Tách ra các chuỗi không phải ASCII thành một tệp riêng biệt là một cách tuyệt vời để xử lý vấn đề. Hoặc, đặt chúng vào một bảng thành tệp DB hoặc YAML, giúp dễ dàng tinh chỉnh ngôn ngữ mà không cần phải chạm vào mã nguồn. –

+2

Yêu cầu mã hóa rõ ràng là tốt. Tuy nhiên, Ruby đang ngầm chọn ASCII-8BIT cho tất cả các tệp. Có thể đặt rõ ràng một mặc định khác. Ví dụ, đối với các ứng dụng sử dụng các chuỗi UTF-8 hoàn toàn, không có nghĩa là phải bao gồm một chú thích ma thuật trong mỗi tệp, đúng không? – jpgeek

0

Tôi không gặp nhiều, nhưng khi tôi cần đảm bảo UTF-8, tôi sử dụng $ KCODE toàn cầu. Hãy thử đặt điều này trong môi trường của bạn.rb: $KCODE = 'UTF8'

Ngoài ra, bạn có chắc chắn rằng trình chỉnh sửa của bạn đang lưu tệp trong UTF-8 không?

+0

KCODE không ảnh hưởng đến phân tích cú pháp nguồn, afaik. –

13

Tôi nghĩ rằng bạn có thể

  1. sử dụng -E utf-8 đối số dòng lệnh để ruby, hoặc
  2. đặt biến RUBYOPT môi trường của bạn để "-E utf-8"
+0

Việc sử dụng đề xuất chỉ đặt mã hóa bên ngoài. Để đặt cả mã hóa bên ngoài và bên trong, hãy sử dụng '-E utf-8: utf-8'. –

1

Các cao độ chỉ (và DRY!) 1.9 cách đảm bảo rằng tất cả các tệp của bạn (nguồn và nội dung) được tải bằng mã hóa ưa thích của bạn tại thời gian chạy là sử dụng đối số dòng lệnh -E.

Tất cả các phương pháp tiếp cận khác đều có nhược điểm tùy thuộc vào hệ thống của bạn (ví dụ: không thể đặt ENV vars, mã bên thứ ba được tải trước không phù hợp để sử dụng Encoding.default_external, ...).

máy chủ sản xuất của tôi sử dụng kịch bản wrapper sau:

#!/bin/bash 
exec /usr/local/rvm/rubies/default/bin/ruby -E utf-8:utf-8 "[email protected]" 

(hãy chắc chắn để thích ứng với đường dẫn)

3

Không phải là một câu trả lời trực tiếp, nhưng tùy thuộc vào môi trường mã hóa của bạn, bạn có thể để cho các biên tập viên chăm sóc của mọi thứ. Emacs' ruby-mode ví dụ có biến ruby-insert-encoding-magic-comment:

ruby-chèn mã hóa-magic-bình luận là một biến được định nghĩa trong `ruby-mode.el ' Giá trị của nó là t

Tài liệu: * Chèn chú thích' mã hóa 'ma thuật khi lưu nếu điều này không phải là không.

Bạn có thể tùy chỉnh biến này.

Tôi chắc chắn có điều gì đó tương tự cho các trình chỉnh sửa khác. Chắc chắn, nó vẫn có nghĩa là thêm nhận xét ma thuật vào mọi tệp, nhưng ít nhất trình chỉnh sửa sẽ tự động thực hiện cho bạn thay vì bạn phải nhớ.

4

Có một viên ngọc mà bộ nhận xét kỳ diệu trên đầu trang trên tất cả các tập tin mà cần nó trong một dự án Rails: https://github.com/m-ryan/magic_encoding

Bạn chỉ cần cài đặt nó và chạy magic_encoding trong thư mục gốc của dự án của bạn, vấn đề giải quyết.

+0

Siêu đơn giản và cực kỳ nhanh. – lightyrs

12

Theo tôi, rõ ràng không phải lúc nào cũng tốt hơn là ngầm.

Khi gần như tất cả nguồn bạn sử dụng là tương thích UTF-8, bạn có thể dễ dàng tránh đặt nhận xét mã hóa ma thuật bằng cách sử dụng tùy chọn dòng lệnh -Ku của Ruby.

Đừng nhầm lẫn thông số "u" của các tùy chọn -K với các tùy chọn -U.

-Ku : set internal and script encoding to utf-8 
-U : set internal encoding to utf-8 

Sau đó, đặt nhận xét mã hóa ma thuật chỉ trong tập lệnh cần đến. Hãy nhớ rằng, quy ước về cấu hình!

Bạn có thể thiết lập các biến môi trường RUBYOPT=-Ku

Xem Ruby tùy chọn dòng lệnh tại http://www.manpagez.com/man/1/ruby/.

+0

Tùy chọn dòng lệnh của Ruby có sẵn tại dòng lệnh bằng cách gõ 'man ruby' hoặc' info ruby' trên * nix và Mac OS. –

+0

cho Rails, thêm tham số '-Ku' vào tệp' script/rails' –

Các vấn đề liên quan