2010-06-19 40 views
9

Tôi nhận được một số dữ liệu chuỗi từ web và tôi nghi ngờ rằng nó không phải lúc nào cũng giống như những gì nó nói. Tôi không biết vấn đề là ở đâu, và tôi không quan tâm nữa. Từ ngày đầu tiên trên dự án này, tôi đã chiến đấu với mã hóa chuỗi Ruby. Tôi thực sự muốn một số cách để nói: "Đây là một chuỗi. Nó là gì?", Và sau đó sử dụng dữ liệu đó để có được nó để UTF-8 để nó không phát nổ gsub() 2.000 dòng xuống trong độ sâu của ứng dụng của tôi. Tôi đã kiểm tra rchardet, nhưng mặc dù nó được cho là hoạt động cho 1,9 bây giờ, nó chỉ thổi lên cho bất kỳ đầu vào với nhiều byte ... mà không phải là hữu ích.Phát hiện mã hóa

+0

Trong Ruby, bạn có thể kiểm tra mã hóa chuỗi bằng 'str.encode.name'. Bạn có thể chỉ định mã hóa luồng/tệp tại thời điểm kết nối/mở. Ví dụ. 'fh = File.open (file_in," rb: utf-16le ")' (thông báo, mã hóa không phải 8 bit cần đọc nhị phân). Khi ghi vào một tập tin, bạn cũng nên chỉ định mã hóa. –

Trả lời

1

Hãy thử cài đặt chúng trong môi trường của bạn.

 
export LC_ALL=en_US.UTF-8 
export LC_CTYPE=en_US.UTF-8 

Hãy thử ruby -EBINARY hoặc ruby -EASCII-8BIT chỉ huy dòng

Hãy thử thêm -Ku hoặc -Kn vào dòng lệnh ruby ​​của bạn.

Bạn có thể dán thông báo lỗi không?

Cũng thử này: http://github.com/candlerb/string19/blob/master/string19.rb

8

Không thể nói từ một chuỗi những gì mã hóa nó là trong Bạn luôn cần một số siêu dữ liệu bổ sung mà sẽ cho bạn biết những gì mã hóa của chuỗi là..

Nếu bạn nhận được chuỗi từ web, siêu dữ liệu đó nằm trong tiêu đề HTTP. Nếu tiêu đề HTTP sai, hoàn toàn không có gì mà bạn hoặc Ruby hoặc bất kỳ ai khác có thể làm. Bạn cần phải gửi một lỗi với quản trị viên web của trang web nơi bạn đã nhận chuỗi và đợi cho đến khi sửa lỗi. Nếu bạn có Thỏa thuận mức dịch vụ với trang web, hãy gửi một lỗi, chờ một tuần, sau đó kiện họ.

+6

Không thể biết chắc chắn, nhưng bạn có thể đoán được. Đó là những gì rchardet làm. Tuy nhiên, tôi đã không thể làm cho nó hoạt động với Ruby 1.9. – ThomasW

3

Cũ câu hỏi, nhưng chardet hoạt động trên 1.9: http://rubygems.org/gems/chardet

+1

Đừng bận tâm, có vẻ như tôi sai về điều này. Chuỗi # encoding on 1.9 cho bạn biết mã hóa chuỗi đang ở trong đó. –

2

Chúng tôi đã có một số kinh nghiệm tốt với ensure_encoding. Nó thực sự làm công việc cho chúng tôi để chuyển đổi các tập tin tài nguyên có mã hóa chưa biết đến UTF-8.

README sẽ cung cấp cho bạn một số gợi ý tùy chọn nào phù hợp với hoàn cảnh của bạn.

Tôi chưa bao giờ thử sử dụng chardet vì assurance_encoding thực hiện công việc tốt cho chúng tôi.

Tôi đã trả tiền here cách chúng tôi sử dụng Ensure_encoding.

8

Bạn thực sự không thể phát hiện mã hóa. Bạn chỉ có thể giả định nó.

Đối với hầu hết các ứng dụng ngôn ngữ phương Tây, cấu trúc sau đây sẽ hoạt động. Mã hóa truyền thống thường là "ISO-8859-1". Mã hóa mới và ưa thích là UTF-8. Tại sao không chỉ đơn giản là cố gắng để mã hóa nó với UTF-8 và dự phòng với các bảng mã cũ

def detect_encoding(str) 
    begin 
    str.encode("UTF-8") 
    "UTF-8" 
    rescue 
    "ISO-8859-1" 
    end 
end 
1

tại sao không thử sử dụng https://github.com/brianmario/charlock_holmes để có được mã hóa chính xác. Sau đó cũng sử dụng nó để chuyển đổi sang UTF8

require 'charlock_holmes' 
    class EncodeParser 
     def initialize(text) 
     @text = text 
     end 

     def detected_encoding 
     CharlockHolmes::EncodingDetector.detect(@text)[:encoding] 
     end 

     def convert_to_utf8 
     CharlockHolmes::Converter.convert(@text, detected_encoding, "UTF-8") 
     end 
    end 

sau đó chỉ cần sử dụng EncodeParser.new (văn bản) .detected_encoding hoặc EncodeParser.new (văn bản).convert_to_utf8

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