2

我对文本编码有一个小问题。

我有两个从 SQL Server 2008 数据库(nvarchar 字段)加载的字符串

从数据库加载它们后,Visual Studio 2010 在监视窗口中显示如下:

str1 = "Test"
str2 = "Test"

但与str1 = str2回报的比较False

如果我将这些字符串写入使用 UTF8 编码的文件,则结果如预期:

测试
测试

如果我将这些字符串写入使用 ANSI(默认)编码的文件,则结果与预期不符

?测试
测试

将字符串转换为字节:

System.Text.Encoding.Default.GetBytes(str1) 'Returns ByteArray {63, 84, 101, 115, 116}
System.Text.Encoding.Default.GetBytes(str2) 'Returns ByteArray {84, 101, 115, 116}

System.Text.Encoding.UTF8.GetBytes(str1) 'Returns ByteArray {239, 187, 191, 84, 101, 115, 116}
System.Text.Encoding.UTF8.GetBytes(str2) 'Returns ByteArray {84, 101, 115, 116}

ANSI 编码的字节 63 或 str1 的 UTF8 编码的字节 239、187、191 来自哪里?

嗯,字节 239、187、191 是 UTF8 的BOM。这里的问题更可能是:为什么我得到 str1 的 BOM 而不是 str2?

(嗯,这些值是传递给将它们插入数据库的 web 服务的值,初始值由我无法控制的客户端传递给这个 web 服务)

4

3 回答 3

3

我很清楚,您确实从数据库中的两个不同记录中读取了两个字符串,对吗?不是以两种不同的方式来自一个记录?

那么,有人在一个记录中存储了一个 BOM。由于 BOM 在打印时是不可见的,因此您不会看到视觉差异。除非您将字符串转换为无法存储 BOM 的编码。
这就是上面发生的事情。

要解决这个问题,您需要清理数据库。读取每条记录,查看它是否以 BOM 开头,如果是,则将内容(不带 BOM)写回。

编辑:我后来才注意到你说这个数据库是由网络服务动态创建的。在这种情况下,解决方案是联系 Web 服务的作者并告诉他们他们的例程中有错误。

于 2012-04-11T11:15:13.233 回答
1

您自己回答:“这些值是传递给将它们插入数据库的 Web 服务的值,初始值由我无法控制的客户端传递给该 Web 服务”

BOM 被插入到那里。检查数据是如何插入的,以及为什么在 str1 中插入了 BOM,而在 str2 中没有插入。

于 2012-04-11T11:19:19.830 回答
1

在将数据导入 SQL 之前,我已经看到过这种情况。实际上,导入是从 CSV 文件批量导入。这导致第一行第一列中的数据包含 BOM,因此它使数据无效。

解决方案是清理数据库,但还要确保在插入之前清理来自文件的所有新导入。

于 2012-04-11T11:20:51.940 回答