2010-01-25 31 views
13

Tôi đang cố gắng chuyển một số ứng dụng cũ của mình sang Ruby 1.9 và tôi vẫn nhận được cảnh báo về cách "Ruby 1.9 chưa hỗ trợ chuẩn hóa Unicode." Tôi đã theo dõi nó xuống để chức năng này, nhưng tôi nhận được khoảng 20 thông điệp cảnh báo theo yêu cầu:Ruby 1.9 không hỗ trợ chuẩn hóa Unicode

ray-2.3.5/activesupport/lib/active_support/inflector.rb

def transliterate(string) 
    warn "Ruby 1.9 doesn't support Unicode normalization yet" 
    string.dup 
end 

Bất kỳ ý tưởng làm thế nào tôi nên bắt đầu theo dõi chúng xuống và giải quyết nó?

Trả lời

9

Nếu bạn nhận thức được những hậu quả, nhân vật tức là có dấu sẽ không được phiên âm trong Ruby 1.9.1 + Rails 2.3.x, đặt này trong config/initializers để im lặng cảnh báo:

# http://stackoverflow.com/questions/2135247/ruby-1-9-doesnt-support-unicode-normalization-yet 
module ActiveSupport 
    module Inflector 
    # Calling String#parameterize prints a warning under Ruby 1.9, 
    # even if the data in the string doesn't need transliterating. 
    if Rails.version =~ /^2\.3/ 
     undef_method :transliterate 
     def transliterate(string) 
     string.dup 
     end 
    end 
    end 
end 

Rails 3 thực sự giải quyết vấn đề này, vì vậy sẽ có giải pháp tương lai hơn để di chuyển về vấn đề này.

2

Định nghĩa phương thức đó được bao bọc trong câu lệnh if cho Ruby 1.9. Ngay phía trên nó, bạn sẽ tìm thấy định nghĩa thông thường, trong đó cho thấy nhiều hơn một chút về những gì điều này đang làm. Đó là một phương pháp được sử dụng để chuyển đổi các ký tự có dấu vào các biến thể thông thường của chúng. Ví dụ .: á =>a, hoặc ë =>e

Nhưng phương pháp này chỉ được sử dụng trong parameterize, đó là lần lượt được xác định ngay trên transliterate. Tất cả điều này vẫn còn trong ActiveSupport. Tôi không thể tìm thấy bất cứ điều gì được gọi trực tiếp parameterize.

Vì vậy, có lẽ bạn đang sử dụng tham số hóa hoặc tự phiên âm, ở đâu đó trong ứng dụng Rails của bạn?

sử dụng chung (theo các tài liệu tham số) là để tạo permalinks thân thiện từ chuỗi tùy ý, giống như SO không, ví dụ:

http://stackoverflow.com/questions/2135247/ruby-1-9-doesnt-support-unicode-normalization-yet 
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
2

Thay thế cơ thể của phương pháp này với

raise "transliterate called" 

và quan sát một backtrace mà sẽ cho bạn thấy nơi mà các công cụ đến từ các cuộc gọi đầu tiên. Tất nhiên, ứng dụng của bạn sẽ sụp đổ nhưng điều đó có thể sẽ cho bạn thủ phạm từ lần thử đầu tiên.

1

Tôi đánh giá cao đây là cách bẩn để giải quyết vấn đề, nhưng đã đọc thông báo lỗi tôi biết vấn đề. Vì vậy, tôi muốn loại bỏ các cảnh báo. Anh đã đánh rơi mã này trong environment.rb:

module ActiveSupport 
    module Inflector 
    # Calling String#parameterize prints a warning under Ruby 1.9, 
    # even if the data in the string doesn't need transliterating. 
    # Maybe Rails 3 will have fixed it...? 
    if RAILS_GEM_VERSION =~ /^2\.3/ 
     undef_method :transliterate 
     def transliterate(string) 
     string.dup 
     end 
    end 
    end 
end 
1

Nếu bạn không muốn con khỉ vá module Inflector, bạn cũng có thể làm được điều này ...

Cả hai sau đây làm việc cho tôi để bịt miệng này gây phiền nhiễu "Ruby 1.9 không hỗ trợ bình thường Unicode chưa" cảnh báo:

silence_stream(STDERR) { 
    whatever_code_caused_transliterate_to_be_called 
} 

hoặc

silence_warnings { 
    whatever_code_caused_transliterate_to_be_called 
} 

này không có những bất lợi mà nó đòi hỏi cluttering lên mã gọi của bạn, nhưng nó là một kỹ thuật bạn có thể sử dụng thường bất cứ khi nào bạn không muốn thấy cảnh báo hoặc đầu ra khác.

activesupport cung cấp silence_streamsilence_warnings trong activesupport-2.3.11/lib/active_support/core_ext/kernel/reporting.rb

+0

Tôi nghĩ rằng "lộn xộn" đáng giá để có thể im lặng cảnh báo cho các trường hợp cụ thể và cũng để làm cho nó rõ ràng cho người đọc khác rằng họ bị tắt tiếng. –

4

Các StringEx Gem dường như làm việc khá tốt. Nó cũng không phụ thuộc vào Iconv.

Nó cho biết thêm một số phương thức cho lớp String, như "to_ascii" mà không phiên âm đẹp ra khỏi hộp:

require 'stringex' 
"äöüÄÖÜßë".to_ascii #=> "aouAOUsse" 

Ngoài ra, Babosa Gem làm một công việc tuyệt vời chuyển ngữ UTF-8 chuỗi, ngay cả với ngôn ngữ hỗ trợ:

"Jürgen Müller".to_slug.transliterate.to_s   #=> "Jurgen Muller" 
"Jürgen Müller".to_slug.transliterate(:german).to_s #=> "Juergen Mueller" 

Thưởng thức.

0

Chuỗi # unicode_normalize, Chuỗi # unicode_normalize!, Chuỗi # unicode_normalized? sẽ được giới thiệu trong Ruby 2.2. Bạn có thể xem mã mẫu và triển khai trong test case, lib/unicode_normalize.rblib/unicode_normalize/normalize.rb.

// U+00E1: LATIN SMALL LETTER A WITH ACUTE 
// U+U+0301: COMBINING ACUTE ACCENT 

puts "\u00E1" == "a\u0301".unicode_normalize(:nfc) 
puts true == "a".unicode_normalized?(:nfc) 
Các vấn đề liên quan