2011-01-28 38 views
5

Đây là ảnh chụp trong bóng tối và tôi xin lỗi trước nếu câu hỏi này có vẻ giống như những người ramblings của một người điên.C#, UTF-8 và mã hóa các ký tự

Là một phần của tích hợp với bên thứ ba, tôi cần mã hóa UTF8 một số thông tin chuỗi bằng C# để tôi có thể gửi nó tới máy chủ đích thông qua biểu mẫu nhiều phần. Vấn đề là họ đang từ chối một số nội dung gửi của tôi, có lẽ vì tôi không mã hóa nội dung của họ một cách chính xác.

Ngay bây giờ, tôi đang cố gắng tìm ra cách gạch ngang hoặc dấu gạch nối - Tôi không thể biết đó chỉ là bằng cách nhìn vào nó - được máy chủ đích nhận hoặc giải thích là [email protected]~S (vâng, đó là một chuỗi gồm 5 ký tự và không phải là trình duyệt của bạn bị trục trặc). Và thật không may là tôi không có hiểu biết đầy đủ về số Encoding.UTF8.GetBytes() để biết cách sử dụng mảng byte để bắt đầu xác định vị trí của sự cố.

Nếu ai cũng có thể cung cấp bất kỳ lời khuyên hoặc lời khuyên nào, tôi sẽ đánh giá cao điều đó. Cho đến nay người bạn duy nhất của tôi đã là MSDN, và không có nhiều người trong số đó.

CẬP NHẬT 1: Sau khi tìm hiểu thêm, tôi phát hiện sử dụng System.Web.HttpUtility.UrlEncode() để mã hóa ký tự EM DASH ("-") sẽ mã hóa nó thành "% e2% 80% 94".

Tôi hiện đang gửi thông tin này trong một bài đăng HttpWebRequest, với loại nội dung "application/x-www-form-urlencoded" - đây có phải là nguyên nhân gây ra sự cố không? Và nếu vậy, cách thích hợp để mã hóa một loạt các cặp tên-giá trị có giá trị nào có thể chứa các ký tự Unicode, sao cho nó sẽ được một máy chủ mong đợi một yêu cầu UTF-8 hiểu được?

+0

Từ kết quả đó, tôi đoán bạn có thể ascii mã hóa kết quả mã hóa utf8 một dấu gạch ngang em. – Joshua

+0

Ngay cả với mã hóa sai, rất khó có thể dịch một dấu gạch ngang 1 ký tự thành chuỗi gồm 5 ký tự. Nó có lẽ không chỉ là một vấn đề mã hóa. –

+0

@Joshua: Tôi nghĩ bạn gần gũi với vấn đề. Tôi vừa thêm bản cập nhật vào bài đăng gốc của mình với một số thông tin khác. –

Trả lời

3
byte[] test = System.Text.Encoding.UTF8.GetBytes("-"); 

nên cung cấp cho bạn

test[0] = 0x2D (45 as integer). 

Xác minh rằng bạn gửi 0x2D đến máy chủ mục tiêu.

+1

Wireshark hữu ích cho loại công cụ này – Marlon

+0

Tôi chưa bao giờ sử dụng Wireshark trước đây, nhưng nhà phát triển chính của chúng tôi rất có kinh nghiệm với Fiddler. Tôi sẽ chụp ảnh này ngay sau khi tôi quay lại văn phòng - cảm ơn bạn đã tip. –

+0

Wireshark rất đơn giản để thiết lập. Nó cho phép bạn xem những gói dữ liệu nào đang được gửi đến máy chủ của bạn. Bạn có thể lọc dữ liệu theo nhiều cách để bạn không bị mất dữ liệu. – Chauncat

1

Bạn có thể cần thêm thông số "charset = utf-8" vào tiêu đề Loại nội dung của mình. Bạn cũng có thể muốn có tiêu đề Content-Encoding để đặt mã hóa của mình. Các tiêu đề phải có các nội dung sau:

Loại nội dung: multipart/form-data; charset = utf-8

Nếu không, máy chủ web sẽ không biết byte của bạn là byte UTF-8, do đó, máy chủ sẽ hiểu sai chúng.

+0

Bạn chính xác ở chỗ tôi hiện không xác định rõ ràng loại mã hóa nội dung khi tôi gửi biểu mẫu nhiều phần. Tôi vừa gửi email cho bên thứ ba, hỏi xem họ có biết loại nội dung dự kiến ​​mặc định là gì không - đó có phải là thứ họ có thể dễ dàng nhận ra không? Tôi nghĩ rằng họ đang chạy các máy chủ Microsoft (IIS). –

+0

'UTF-8' là [không phải là giá trị' Mã hóa nội dung 'hợp lệ] (http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.11). Tiêu đề đó được sử dụng để chỉ ra cách tải trọng được nén. Nó không được sử dụng để chỉ ra bảng mã. – dkarp

+0

@dkarp là đúng. – Jacob

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