2012-10-04 30 views
5

Tôi nhận được lỗi sau:lỗi Encoding với Rails, PostgreSQL và ký tự phi tiêu chuẩn

ActiveRecord::StatementInvalid: PG::Error: ERROR: invalid byte sequence for encoding "UTF8": 0xf66e6bf6 : INSERT INTO "response_sets" ("city") VALUES ('Jönköping') RETURNING "id" 

Cơ sở dữ liệu là PostgreSQL 9.0.6 trên một ứng dụng Heroku.

Không chắc chắn cách khắc phục lỗi đó khi có các ký tự lẻ.

Trả lời

8

Cơ sở dữ liệu của bạn không được đặt thành cùng một lược đồ mã hóa như chuỗi bạn đang cố chèn. Tôi sẽ tưởng tượng Postgres trên Heroku được thiết lập để sử dụng UTF-8 theo mặc định và đầu vào của bạn có thể là một trong những biến thể latin nếu tôi phải đoán. Bạn có thể thiết lập cơ sở dữ liệu của bạn để chấp nhận các chương trình mã hóa bạn đang cung cấp, ví dụ:

SET CLIENT_ENCODING 'ISO-8859-2' 

Hoặc bạn có thể chuyển mã đầu vào của bạn sang UTF-8 (điều này có lẽ là tốt hơn)

"my string".encode('UTF-8') 
4

Đó là khả năng cơ sở dữ liệu của bạn không được đặt thành mã hóa giống như chuỗi bạn đang chèn. Postgres thường là UTF-8. Bạn sẽ phải đặt mã hóa thích hợp trên chuỗi của mình.
Đó có thể đơn giản như

"string".encode('UTF-8') 

Hoặc nếu chuỗi được gắn thẻ sai bạn cũng có thể phải force_encoding đầu tiên. I E. nó được lưu trữ dưới dạng 'Windows-1252' nhưng không được Ruby đánh dấu như vậy.

"string".force_encoding('Windows-1252').encode('UTF-8') 

Chúng tôi có vấn đề này làm việc với Sendgrid + Heroku Rails http://blog.zenlike.me/2013/04/06/sendgrid-parse-incoming-email-encoding-errors-for-rails-apps-using-postgresql/

+0

force_encoding là thành phần ma thuật tôi cần để sửa lỗi. Tôi cũng đang sử dụng Sendgrid + Heroku Rails, cụ thể là sử dụng chức năng Parse cho các email đến (trên: văn bản của họ và: thông số html) – LikeMaBell

+0

Bạn đã cứu mạng tôi ... –

0

Điều này dường như làm việc cho tôi:

"Hern\xE1ndez".encode('UTF-8','ISO-8859-1') 

Đối số đầu tiên là mã hóa mà bạn muốn chuỗi là trong và đối số thứ hai là mã hóa mà bạn cho rằng chuỗi đang ở.

String#encode

Ngoài ra còn có các tùy chọn trong tài liệu về cách xử lý các ký tự không hợp lệ hoặc không xác định.

Đây là những gì tôi đã kết thúc sử dụng (chỉ để được an toàn):

"Hern\xE1ndez".encode('UTF-8','ISO-8859-1', :invalid => :replace, :undef => :replace, :replace => "?") 

Bạn cũng có thể tạo nên một phương pháp helper:

def convert_to_utf_8(string) 
    string.encode('UTF-8','ISO-8859-1', :invalid => :replace, :undef => :replace, :replace => "?") 
end 

Vấn đề tôi đã có được nạp dữ liệu từ API dịch vụ người bán của Amazon.

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