2014-09-29 32 views
6

Sử dụng C#, tôi tìm nạp giá trị TextBox.Text từ trang .ascx. Khi tôi so sánh sự bình đẳng của giá trị với một đối tượng chuỗi thông thường bên trong một truy vấn LINQ, nó luôn trả về false.C# - So sánh các chuỗi mã hóa khác nhau

Tôi đã đi đến kết luận rằng chúng được mã hóa khác nhau, nhưng cho đến nay không có may mắn trong việc chuyển đổi hoặc so sánh chúng.

docname = "Testdoc 1.docx"; //regular string created in C# 
fetchedVal = ((TextBox)e.Item.FindControl("txtSelectedDocs")).Text; //UTF-8 

Hai chuỗi trên là giống hệt nhau khi biểu diễn dưới dạng chữ, nhưng so sánh byte[] họ rõ ràng là khác nhau do sự mã hóa.

Tôi đã thử rất nhiều thứ khác nhau, chẳng hạn như:

System.Text.Encoding.Default.GetString(utf8.GetBytes(fetchedVal)); 

nhưng điều đó sẽ trả về giá trị "Testdoc 1.docx".

Nếu tôi thay vì cố gắng

System.Text.Encoding.Default.GetString(System.Text.Encoding.Default.GetBytes(fetchedVal)); 

nó trả "Testdoc 1.docx" nhưng một Equals() -Kiểm tra vẫn trả false.

Tôi cũng đã thử những điều sau đây, mà dường như là cách tiếp cận đề nghị, nhưng không có may mắn:

byte[] utf8Bytes = Encoding.UTF8.GetBytes(fetchedVal); 
byte[] unicodeBytes = Encoding.Convert(Encoding.UTF8, Encoding.Unicode, utf8Bytes); 
string fetchedValConverted = Encoding.Unicode.GetString(unicodeBytes); 

Thủ phạm dường như là khoảng trắng, bởi vì khi kiểm tra các chuỗi byte nó luôn luôn byte thứ bảy khác nhau.

Làm thế nào để bạn chuyển đổi đúng từ UTF-8 thành mã hóa chuỗi mặc định trong C#?

+0

Tôi không chắc chính xác vấn đề ở đây là gì, nhưng tôi muốn chỉ cho bạn chức năng Bình thường hóa chuỗi. Không biết nếu điều này sẽ khắc phục được sự cố của bạn, nhưng có thể hữu ích cho bạn để bình thường hóa các chuỗi trước khi so sánh chúng. http://msdn.microsoft.com/en-us/library/system.string.normalize(v=vs.110).aspx –

+0

Xem câu trả lời của @SLaks, điều này không liên quan đến việc mã hóa. Trong .NET, tất cả các chuỗi đều bằng nhau, cụ thể là mã hóa Unicode trong UTF-16. Thủ phạm ở đây là một không gian không phá vỡ, xem [HTML encoding issues - "Â" ký tự hiển thị thay vì " "] (http://stackoverflow.com/questions/1461907/html-encoding-issues-%C3% 82-ký tự hiển thị-thay-cho-nbsp). Văn bản này ở đâu trong hộp văn bản của bạn được dán từ và văn bản đó được xuất ra như thế nào? – CodeCaster

+1

Cũng giống như một phản ứng với @DavidS., Tôi đã khám phá chức năng 'Normalize', nhưng không thành công. @CodeCaster, 'TextBox.Text' được đặt từ JQuery. Tôi nhớ thực tế là nó có thể là do điều đó! –

Trả lời

6

Chuỗi không có mã hóa hoặc mảng byte. Encodings chỉ đi vào chơi khi bạn chuyển đổi một chuỗi thành một mảng byte; bạn chỉ có thể làm điều đó bằng cách chỉ định mã hóa nào sẽ sử dụng để chọn byte.

Có vẻ như bạn thực sự chỉ có các ký tự khác nhau trong chuỗi của mình. Bạn có thể có một nhân vật vô hình trong một trong số họ, hoặc họ có thể có các nhân vật khác nhau trông giống nhau.

Để tìm hiểu, hãy xem các giá trị mã điểm Unicode của từng ký tự trong mỗi chuỗi (ví dụ: (int) str[0]).

+0

Điều này có vẻ rất hợp lý, tôi sẽ xem xét điều đầu tiên vào buổi sáng! –

+0

Đây là vấn đề. Bằng cách nào đó, một ký tự khoảng trắng (' ', 'U + 0020') thực chất là một không gian không phá vỡ ('   '). –

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