4

以下代码是一种解决方法,它允许我们使用现有产品中的某些功能,而无需更改其中的任何代码。这对我们来说是件好事,但我想了解为什么会这样?0x81 字符有什么特别之处?

"A".Equals(Encoding.UTF8.GetString(new byte[] { 0x41, 0x81 }), StringComparison.InvariantCulture) // Returns TRUE

上面的代码适用于 CurrentCulture 和 InvariantCulture 但不适用于 Ordinal。这是有道理的,因为按顺序比较每个字节都会在上面的代码中失败。它不适用于默认编码 (SBCS)。

4

2 回答 2

4

字节序列 { 0x41, 0x81 } 不是有效的 UTF-8,因为字节 0x41 本身代表 'A' 字符,并且字节 0x81 不能出现在 UTF-8 编码序列的开头,并且是错误的这个位置。

由于 Encoding.UTF8.GetString() 没有抛出异常,它可能会在字符串中添加一个替换字符 (U+FFFD),如MSDN 上的选择后备策略中所述。

因此,您可能正在将字符串“A”与字符串“A”+替换字符进行比较,并且某些字符串比较可能会忽略替换字符,从而返回 true。

于 2013-02-06T06:06:31.700 回答
-1

您只需删除文化信息,它就可以正常工作,即使用 "A".Equals(Encoding.UTF8.GetString(new byte[] { 0x41, 0x81 })) 代替 "A".Equals(Encoding.UTF8. GetString(new byte[] { 0x41, 0x81 }), StringComparison.InvariantCulture)

于 2013-02-06T06:27:10.080 回答