c# - 为什么以下字符串比较代码在附加 0x81 后返回 TRUE

标签 c# .net string encoding string-comparison

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

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

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

最佳答案

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

由于 Encoding.UTF8.GetString() 没有抛出异常,它可能会向字符串添加替换字符 (U+FFFD),如 choosing a fallback strategy 中所述在 MSDN 上。

所以你可能在比较字符串“A”和字符串“A”+替换字符,而一些字符串比较可能会忽略替换字符,从而返回 true。

关于c# - 为什么以下字符串比较代码在附加 0x81 后返回 TRUE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14722474/

相关文章:

c# - 使用双重检查锁定的内存读取可见性排序与写入顺序

c# - 使用 Ably.io 连接创建连接时出现未知错误

java - 如何在不使用第三方库的情况下转义java字符串中的unicode字符

c# - 无法将 JSON 数组反序列化为 C# 列表

c# - 自动更新 WPF 应用程序

Java 正则表达式在我的系统中工作但在服务器中不工作

c++ - C++中的字符串连接问题

c++ - 如何从 C++ 中的字符串中提取值对

c# - 有方法的属性?

c# - 串口工作7-8小时卡住或停止发送串口通讯