2011-01-19 36 views
5

Tôi chỉ có một cách ngẫu nhiên lỗi lạ này qua Rails 3, trên Heroku (postgres)Rails 3, Heroku - PGError: ERROR: chuỗi byte không hợp lệ để mã hóa "UTF8":

PGError: ERROR: invalid byte sequence for encoding "UTF8": 0x85 HINT: This error can also happen if the byte sequence does not match the encoding expected by the server, which is controlled by "client_encoding". : INSERT INTO "comments" ("content") VALUES ('BTW∑I re-listened to the video' ...... 

Các gợi ý trong khi isn đẹp' t làm bất cứ điều gì nhấp cho tôi. Tôi có thể đặt mã hóa ở đâu đó không? Tôi có nên rối tung với điều đó không? Bất cứ ai nhìn thấy điều này và/hoặc có bất kỳ ý tưởng về cách đối phó với loại vấn đề này?

Cảm ơn bạn

Trả lời

6

Từ những gì tôi có thể thu thập, đây là một vấn đề mà các chuỗi bạn đang cố gắng để chèn vào máy chủ PostgrSQL của bạn không được mã hóa với UTF-8. Điều này hơi kỳ quặc, vì ứng dụng Rails của bạn nên được cấu hình để sử dụng UTF-8 theo mặc định.

Có một vài cách bạn có thể thử sửa lỗi này (theo thứ tự những gì tôi đề nghị):

  • Trước hết, hãy chắc chắn rằng config.encoding được thiết lập để "utf-8" trong config/application.rb.

  • Nếu bạn đang sử dụng Ruby 1.9, bạn có thể thử buộc mã hóa ký tự trước khi chèn bằng toutf8.

  • Bạn có thể tìm ra chuỗi của mình được mã hóa và đặt thủ công SET CLIENT_ENCODING TO 'ISO-8859-1'; (hoặc bất kỳ mã hóa nào) trên kết nối PostgeSQL của bạn trước khi chèn chuỗi. Đừng quên làm RESET CLIENT_ENCODING; sau câu lệnh để đặt lại mã hóa.

  • Nếu bạn đang sử dụng Ruby 1.8 (nhiều khả năng hơn), bạn có thể sử dụng thư viện iconv để chuyển đổi chuỗi thành UTF-8. Xem tài liệu here.

  • Giải pháp tin tặc hơn là ghi đè các getters và setters của bạn trong mô hình (ví dụ: contentcontent=) mã hóa và giải mã chuỗi của bạn bằng Base64. Nó muốn tìm một cái gì đó như thế này:

 

require 'base64' 

class Comment 
    def content 
    Base64::decode64(self[:content]) 
    end 

    def content=(value) 
    self[:content] = Base64::encode64(value) 
    end 
end 
+0

Cảm ơn bạn vonconrad, bạn là một người tiết kiệm cuộc sống. Tôi đã đặt config.ecoding chính xác. Mặc dù có thể Heroku đang thay đổi một cái gì đó khi triển khai. Nếu tôi đi với các giải pháp iconv, mà có vẻ như sự lựa chọn thông minh nhất từ ​​bình luận của bạn, bất kỳ vấn đề nhìn thấy khi di chuyển lên đến Ruby 1.9? Ngoài ra các tài liệu là khá trống cho iconv và tôi là một newbie, bất kỳ cách nào để xem một ví dụ? cảm ơn! – AnApprentice

+3

Tôi tin rằng 'iconv' sẽ hoạt động với cả 1.8 và 1.9. Đối với mã, một cái gì đó như thế này sẽ làm việc: 'content = :: Iconv.conv ('UTF-8 // IGNORE', 'UTF-8', nội dung + '') [0 ..- 2]'. Về cơ bản, điều này buộc mã hóa phải là UTF-8, bất kể nó ban đầu là gì. Tôi nhận được mã từ đây: http://stackoverflow.com/questions/4583924/string-force-encoding-in-ruby-1-8-7-or-rails-2-x/4585362#4585362 – vonconrad

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