【问题标题】:C# - Comparing strings of different encodingsC# - 比较不同编码的字符串
【发布时间】: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 设置的。我错过了一个事实,可能是因为这个!

标签: c# string encoding


【解决方案1】:

字符串没有编码或字节数组。只有在将字符串转换为字节数组时,编码才会发挥作用;您只能通过指定用于选择字节的编码来做到这一点。

听起来你实际上只是在你的字符串中有不同的字符。您可能在其中一个中有一个不可见的字符,或者它们可能有看起来相同的不同字符。

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

【讨论】:

  • 这看起来很有道理,我会在早上第一件事调查它!
  • 这就是问题所在。不知何故,一个空格字符( U+0020)实际上是一个不间断的空格( )。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-04
  • 1970-01-01
相关资源
最近更新 更多