我对文本编码有一个小问题。
我从SQL Server 2008数据库(nvarchar-field)加载了两个字符串
从数据库加载后,Visual Studio 2010在监视窗口中显示如下:
str1 = "Test"
str2 = "Test"
但与str1 = str2
的比较会返回False
如果我将这些字符串写入具有UTF8编码的文件,则结果符合预期:
测试
测试
如果我将这些字符串写入带有ANSI(默认)编码的文件,则结果为 NOT ,如预期的那样:
?测试
测试
将字符串转换为字节:
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}
如果是ASCII编码,则字节63在哪里;对于str1的UTF8编码,字节239,187,191来自字节239,187,191?
嗯,Bytes 239,187,191是UTF8的BOM。这里的问题更可能是:为什么我得到str1的BOM而不是str2?
(嗯,值是传递给webservice的值,它将它们插入数据库,初始值由我无法控制的客户端传递给这个web服务)
答案 0 :(得分:3)
就这样我很清楚,你确实从数据库中的两个不同记录中读取了两个字符串,对吧?不是以两种不同的方式来自一条记录?
那么,有人在一条记录中存储了BOM。由于BOM在打印时不可见,因此您不会看到视觉差异。除非您将字符串转换为无法存储BOM的编码 这就是上面发生的事情。
要解决此问题,您需要清理数据库。读取每条记录,如果以BOM开头,请查看它,如果是,请将内容(不含BOM)写回。
编辑:我后来才注意到你说这个数据库是由webservice即时创建的。在这种情况下,解决方案是联系网络服务的作者并告诉他们他们的日常工作中存在错误。
答案 1 :(得分:1)
你自己回答: “值是传递给Web服务的值,它将它们插入到数据库中,初始值由客户端传递给此Web服务,我无法控制”
将BOM插入其中。 检查数据是如何插入的,以及为什么它插入了str1的BOM而没有插入str2。
答案 2 :(得分:1)
我在将数据导入SQL之前已经看到过这种情况。实际上,导入来自CSV文件的批量导入。这导致第一行第一列中的数据包含BOM,因此它使数据无效。
解决方案是清理数据库,但也要确保在插入之前清除文件中的所有新导入。