2014-09-29 48 views
6

使用C#,我從.ascx頁面獲取TextBox.Text值。當我比較LINQ查詢中的值與常規字符串對象的相等性時,它總是返回false。C# - 比較不同編碼的字符串

我得出結論,他們是不同的編碼,但迄今沒有轉換或比較它們的運氣。當表示爲文本,但比較byte[]它們是由於編碼明顯不同

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

上述兩個字符串相同。

我已經嘗試了很多不同的東西,如:

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

而是將返回值"Testdoc 1.docx"

如果我不是嘗試

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

返回"Testdoc 1.docx"而是Equals() -check仍然返回false

我也曾嘗試以下,這似乎是推薦的方法,但沒有運氣:

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

的罪魁禍首似乎是空白的,因爲檢查的字節序列時,它總是在第七字節這是不同的。

如何正確地從UTF-8轉換爲C#中的默認字符串編碼?

+0

我不確定這裏的問題究竟是什麼,但我想指出你的字符串的Normalize函數。不知道這是否能解決您的問題,但在比較它們之前對字符串進行規範化可能很有用。 http://msdn.microsoft.com/en-us/library/system.string.normalize(v=vs.110).aspx – 2014-09-29 15:33:11

+0

請參閱@SLaks的答案,這與編碼無關。在.NET中,所有字符串都是相同的,即以UTF-16編碼的Unicode。這裏的罪魁禍首是一個不間斷的空間,請參閱[HTML編碼問題 - 「Â」字符而不是「 」](http://stackoverflow.com/questions/1461907/html-encoding-issues-%C3% 82個字符的表示式 - 代替-的-NBSP)。您的文本框中的文本粘貼到哪裏,輸出如何? – CodeCaster 2014-09-29 15:36:18

+1

就像對@DavidS。的迴應一樣,我也探索過'Normalize'函數,但沒有成功。 @CodeCaster,'TextBox.Text'是從JQuery中設置的。我錯過了它可能是由於這個事實! – 2014-09-29 16:28:08

回答

6

字符串沒有編碼或字節數組。編碼僅在將字符串轉換爲字節數組時才起作用;您只能通過指定使用哪種編碼來選擇字節來實現這一點。

這聽起來像你實際上只是在你的字符串中有不同的字符。你可能在其中一個隱形角色,或者他們可能有不同的角色看起來相同。

要了解一下,請查看每個字符串中每個字符的Unicode碼值(例如,(int) str[0])。

+0

這看起來很合理,我會在早上第一眼看到它! – 2014-09-29 16:30:30

+0

這是問題所在。不知何故,一個空白字符(' ','U + 0020')實際上是一個不間斷的空格(' ')。 – 2014-10-01 08:17:42