C#-比较不同编码的字符串

C#-比较不同编码的字符串,c#,string,encoding,C#,String,Encoding,使用C#,我从.ascx页面获取TextBox.Text值。当我将该值的相等性与LINQ查询中的常规字符串对象进行比较时,它总是返回false 我得出的结论是,它们的编码方式不同,但到目前为止,还没有机会转换或比较它们 docname = "Testdoc 1.docx"; //regular string created in C# fetchedVal = ((TextBox)e.Item.FindControl("txtSelectedDocs")).Text; //UTF-8 上述两个

使用C#,我从.ascx页面获取
TextBox.Text
值。当我将该值的相等性与LINQ查询中的常规字符串对象进行比较时,它总是返回false

我得出的结论是,它们的编码方式不同,但到目前为止,还没有机会转换或比较它们

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#中的默认字符串编码?

字符串没有编码或字节数组。编码仅在将字符串转换为字节数组时起作用;只能通过指定用于拾取字节的编码来实现这一点

听起来好像字符串中有不同的字符。其中一个角色中可能有一个不可见的角色,或者它们可能有看起来相同的不同角色


要找到答案,请查看每个字符串中每个字符的Unicode代码点值(例如,
(int)str[0]
)。

我不确定这里到底有什么问题,但我想向您指出字符串的规格化函数。不知道这是否能解决您的问题,但在比较字符串之前对字符串进行规范化可能会很有用。请看@SLaks的回答,这与编码无关。在.NET中,所有字符串都是相等的,即用UTF-16编码的Unicode。这里的罪魁祸首是一个不间断的空间,请参见。文本框中的文本粘贴自何处,如何输出?作为对@DavidS的响应,我也探索了
规范化
函数,但没有成功@CodeCaster,从JQuery设置
TextBox.Text
。我错过了一个事实,那就是它可能是由于那!这似乎很有道理,我会在早上第一件事调查它!这就是问题所在。不知何故,一个空白字符(
U+0020
)实际上是一个不间断的空格(
 ;
)。