2012-06-14 30 views
9

Tôi đang cố phân tích cú pháp các chuỗi email với số Ruby mail gem và tôi đang có một thời gian với mã hóa ký tự. Đi theo email sau:Mã hóa ký tự với Ruby 1.9.3 và đá quý mail

MIME-Version: 1.0 
Sender: [email protected] 
Received: by 10.142.239.17 with HTTP; Thu, 14 Jun 2012 06:00:18 -0700 (PDT) 
Date: Thu, 14 Jun 2012 09:00:18 -0400 
Delivered-To: [email protected] 
X-Google-Sender-Auth: MxfFrMybNjBoBt4O4GwAn9cMsko 
Message-ID: <[email protected]om> 
Subject: Re: [Lorem Ipsum] Foo updated the forum topic 'Reply by email test' 
From: Foo Bar <[email protected]> 
To: Foo <[email protected]> 
Content-Type: text/plain; charset=ISO-8859-1 
Content-Transfer-Encoding: quoted-printable 

This email has accents:=A0R=E9sum=E9 
> 
> --------- Reply Above This Line ------------ 
> 
> Email parsing with accents: R=E9sum=E9 
> 
> Click here to view this post in your browser 

Cơ thể email, khi mã hóa đúng cách, nên là:

This reply has accents: Résumé 
> 
> --------- Reply Above This Line ------------ 
> 
> Email parsing with accents: Résumé 
> 
> Click here to view this post in your browser 

Tuy nhiên, tôi đang gặp một con quỷ của một thời gian thực sự nhận được dấu nhấn để đi qua. Đây là những gì tôi đã cố gắng:

message = Mail.new(email_string) 
body = message.body.decoded 

Đó được cho tôi một chuỗi mà bắt đầu như thế này:

This reply has accents:\xA0R\xE9sum\xE9\r\n>\r\n> --------- Reply Above This Line ------------ 

Cuối cùng, tôi cố gắng này:

body.encoding # => <Encoding:ASCII-8BIT> 
body.encode("UTF-8") # => Encoding::UndefinedConversionError: "\xA0" from ASCII-8BIT to UTF-8 

Có ai có bất kỳ đề xuất về Làm thế nào để đối phó với điều này? Tôi khá chắc chắn nó đã làm với các "charset = ISO-8859-1" thiết lập trong email, nhưng tôi không chắc chắn làm thế nào để sử dụng đó, hoặc nếu có một cách để dễ dàng giải nén rằng bằng cách sử dụng đá quý mail.

Trả lời

17

Sau khi chơi một chút, tôi thấy điều này:

body.decoded.force_encoding("ISO-8859-1").encode("UTF-8") # => "This reply has accents: Résumé..." 
message.parts.map { |part| part.decoded.force_encoding("ISO-8859-1").encode(part.charset) } # multi-part 

Bạn có thể trích xuất các charset từ tin nhắn như vậy.

message.charset #=> for simple, non-multipart 
message.parts.map { |part| part.charset } #=> for multipart, each part can have its own charset 

Hãy cẩn thận với những người không nhiều phần dữ liệu, như sau có thể gây ra rắc rối:

body.charset #=> returns "US-ASCII" which is WRONG! 
body.force_encoding(body.charset).encode("UTF-8") #=> Conversion error... 

body.force_encoding(message.charset).encode("UTF-8") #=> Correct conversion :) 
+1

Tuyệt vời. Đã tìm kiếm điều này. Đã kết thúc thực hiện việc này: body = message.text_part.encode ('UTF-8', message.text_part.charset,: invalid =>: replace,: undef =>: replace) –

+0

Awesome ...... Cảm ơn một tun ... – Jyothu

+0

Một số bộ phận dường như có bộ ký tự nil. Tôi không chắc chắn làm thế nào để xử lý những người. –

0

này không làm việc cho tôi, vì vậy nghĩ rằng tôi muốn dính lên các giải pháp tôi đã đến trong trường hợp nó giúp bất cứ ai ...

Về cơ bản phải thêm các giá trị mặc định mã hóa và tinh chỉnh đầu ra thành các chuỗi hợp lý. https://stackoverflow.com/a/26604049/2386548

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