2010-05-05 27 views
36

Đây là một email thô dụ tôi đang cố gắng để phân tích:"= C2 = A0" trong văn bản MIME được mã hóa, văn bản có thể in được là gì?

MIME-version: 1.0 
Content-type: text/html; charset=UTF-8 
Content-transfer-encoding: quoted-printable 
X-Mailer: Verizon Webmail 
X-Originating-IP: [x.x.x.x] 

=C2=A0test testing testing 123 

là gì = C2 = A0? Tôi đã thử một nửa tá các trình phân tích cú pháp có thể in được, nhưng không có trình xử lý nào đúng cách. Làm cách nào để phân tích cú pháp này đúng cách trong C#?

Thành thực mà nói, bây giờ, tôi là mã hóa:

//TODO WTF 
encoded = encoded.Replace("=C2=A0", ""); 

Bởi vì tôi không thể tìm ra lý do tại sao văn bản đó là có một cách ngẫu nhiên trong nội dung MIME, và không phải được trả lại vào bất cứ điều gì . Bởi chỉ cần loại bỏ nó, tôi nhận được hiệu quả mong muốn - nhưng TẠI SAO ?!

Để rõ ràng, tôi biết rằng (= [0-9A-F] {2}) là một ký tự được mã hóa. Nhưng trong trường hợp này, nó dường như đại diện cho NOTHING.

Trả lời

69

"= C2 = A0" đại diện cho các byte C2 A0. Tuy nhiên, vì đây là UTF-8, nó chuyển thành 00A0, là Unicode cho không gian không phá vỡ.

Xem http://en.wikipedia.org/wiki/UTF-8

+0

Cách phân tích cú pháp này trong C# là gì? Tất cả các trình phân tích cú pháp tôi đã thử hoạt động trên từng char một cách độc lập và thực hiện điều này: int iHex = Convert.ToInt32 (hex, 16); char c = (char) iHex; – TheSoftwareJedi

+0

UTF-8 có luôn mã hóa thành 2 byte như thế này không? Tôi có thể giả định một kết quả của (= [0-9A-F] {2} = [0-9A-F] {2}) thay vì một byte không? Tại sao địa ngục không có một trình phân tích cú pháp cho điều này?!?!?!?! – TheSoftwareJedi

+11

Nếu bạn đọc UTF-8, bạn sẽ thấy rằng bất kỳ giá trị byte đơn nào vượt quá 7F phải được mã hóa thành hai ký tự và giá trị đầu tiên sẽ luôn có bit cao. Vì vậy, có, A0 luôn được mã hóa là C2 A0, có nghĩa là bạn không thể đi từng byte một. Cách đúng để xử lý UTF-8 với mã hóa được trích dẫn là đầu tiên giải mã phần được trích dẫn và sau đó giải mã UTF-8, dẫn đến một chuỗi gồm các ký tự 2 byte (về mặt kỹ thuật UCS-16 hoặc UTF-16). –

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