【发布时间】:2014-11-24 01:22:05
【问题描述】:
使用 C#,我从 .ascx 页面获取 TextBox.Text 值。当我将值的相等性与 LINQ 查询中的常规字符串对象进行比较时,它总是返回 false。
我得出的结论是它们的编码方式不同,但到目前为止还没有成功转换或比较它们。
docname = "Testdoc 1.docx"; //regular string created in C#
fetchedVal = ((TextBox)e.Item.FindControl("txtSelectedDocs")).Text; //UTF-8
以上两个字符串表示为字面量时是相同的,但比较byte[],由于编码原因,它们明显不同。
我尝试了很多不同的方法,例如:
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# 中的默认字符串编码?
【问题讨论】:
-
我不确定这里到底是什么问题,但我想向您指出字符串的 Normalize 函数。不知道这是否能解决您的问题,但在比较字符串之前对字符串进行规范化可能会很有用。 msdn.microsoft.com/en-us/library/…
-
查看@SLaks 的回答,这与编码无关。在 .NET 中,所有字符串都是平等的,即以 UTF-16 编码的 Unicode。这里的罪魁祸首是一个不间断的空间,请参阅HTML encoding issues - “” character showing up instead of “ ”。你的文本框中的这个文本是从哪里粘贴的,是如何输出的?
-
作为对@DavidS. 的回应,我也探索了
Normalize函数,但没有成功。 @CodeCaster,TextBox.Text是从 JQuery 设置的。我错过了一个事实,可能是因为这个!