2011-01-03 25 views
13

Có giải pháp nào để sử dụng String.force_encoding() trong Ruby 1.8.7 (hoặc Rails 2.x) để nó hoạt động giống như trong Ruby 1.9 không? Tôi đã đọc điều gì đó về yêu cầu active_support, nhưng điều này không hoạt độngString.force_encoding() trong Ruby 1.8.7 (hoặc Rails 2.x)

$>gem list --local | grep 'đường ray \ | activesupport'

activesupport (3.0.3, 2.3.8, 2.3.5) 
rails (2.3.8, 2.3.5) 

$>ruby ​​-v

ruby 1.8.7 (2010-08-16 patchlevel 302) [i686-darwin10.4.0] 

$>ray -v

Rails 2.3.8 

IRB:

> require "rubygems" 
=> true 
> require "active_support" 
=> true 
> "asdf".force_encoding("UTF-8") 
NoMethodError: undefined method `force_encoding' for "asdf":String 
> String.respond_to?(:force_encoding) 
=> false 

Trả lời

13

Điều duy nhất force_encoding thực hiện trong 1.9 là nó thay đổi trường mã hóa của chuỗi, nó không thực sự sửa đổi byte của chuỗi.

Ruby 1.8 không có khái niệm về mã hóa chuỗi, vì vậy force_encoding sẽ là một no-op. Bạn có thể thêm nó cho mình như thế này nếu bạn muốn để có thể chạy cùng mã trong 1.8 và 1.9:

class String 
    def force_encoding(enc) 
    self 
    end 
end 

Sẽ dĩ nhiên là những thứ khác mà bạn phải làm gì để thực hiện mã hóa làm việc giống nhau trên 1.8 và 1.9, vì chúng xử lý vấn đề này rất khác nhau.

+0

Có lẽ là một câu hỏi ngu ngốc, nhưng ở đâu trong mã của tôi tôi nên thêm cái này? – RealCasually

+0

Mọi nơi sẽ làm, nhiều hơn hoặc ít hơn. Đặt nó vào một tập tin và thêm một 'require' cho tập tin đó cùng với tất cả các' require' khác của bạn ở phía trên của "main" của bạn '.rb'. – Theo

21

này sẽ cung cấp cho bạn Chuỗi # to_my_utf8 trong cả của Ruby và Ruby 1.8.7 1.9:

require 'iconv' 
class String 
    def to_my_utf8 
    ::Iconv.conv('UTF-8//IGNORE', 'UTF-8', self + ' ')[0..-2] 
    end 
end 

Và sau đó ...

?> "asdf".to_my_utf8 
=> "asdf" 

Lấy cảm hứng từ Paul Battley và cũng ghi nhớ một số cũ của tôi làm việc trên remote_table gem.

+0

Tuyệt vời, thật tuyệt! – Fu86

+1

Ngoài sự tò mò: tại sao thêm hai khoảng trắng và sau đó xóa chúng sau khi chuyển đổi? – Theo

+3

Đó là đóng góp của Paul Battley ... như ông nói, "Các byte" nguy hiểm "là những người trong khoảng 194-253" ... nếu chuỗi kết thúc bằng một trong số đó, chuyển đổi đôi khi thổi lên. –

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