Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将字符串写入文件会生成意外内容_C#_Vb.net_Sql Server 2008_.net 4.0_Encoding - Fatal编程技术网

C# 将字符串写入文件会生成意外内容

C# 将字符串写入文件会生成意外内容,c#,vb.net,sql-server-2008,.net-4.0,encoding,C#,Vb.net,Sql Server 2008,.net 4.0,Encoding,我对文本编码有一个小问题 我有两个从SQLServer2008数据库加载的字符串(nvarchar字段) 从数据库加载后,Visual Studio 2010会在“监视”窗口中按如下方式显示它们: str1=“测试” str2=“测试” 但是与str1=str2的比较返回False 如果我将这些字符串写入UTF8编码的文件,结果与预期一致: 测试 试验 如果我使用ANSI(默认)编码将这些字符串写入文件,则结果不是预期的: ?测试 试验 将字符串转换为字节: System.Text.Encodi

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

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

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

str1=“测试”

str2=“测试”

但是与
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在哪里

字节239187191是UTF8的。这里的问题很可能是:为什么我得到的是str1的BOM,而不是str2的BOM


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

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

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

要解决这个问题,您需要清理数据库。阅读每一条记录,看看它是否以BOM开头,如果是,写下内容(没有BOM)

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

您自己回答了: 这些值是传递给Web服务并将其插入数据库的值,初始值由我无法控制的客户端传递给此Web服务

BOM表将插入其中。
检查数据是如何插入的,以及为什么它与str1的BOM一起插入,而与str2的BOM一起插入。

我以前在将数据导入SQL时见过这种情况。实际上,导入是从CSV文件的批量导入。这导致第一行第一列中的数据包含BOM表,因此它在某种程度上使数据无效


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

请决定-C#或VB.NET。您的代码示例建议使用VB.NET,这是C#中的一个编码错误。示例是VB.NET,但这不是关于VB.NET或C#的问题,而是我选择了两者的编码(如果答案是C#或VB.NET对我来说并不重要),那么不要用这些语言标记它(最好用F#或Cobol.NET标记)如果不相关。@Oded ENCONDING.Default返回操作系统当前“ANSI”代码页的编码,而不是UTF16。看见不要与“default”编码UTF8混淆,使用“default”表示“如果不明确指定编码,将得到什么”。我不知道为什么微软决定称之为编码。当它不是默认值时,它是默认值@Ramhound-System.String重写等于和
=
。同样的内容会产生真实的结果。还有实习。是的,那些是不同的记录。忘了提那件事;)哪个“功能”创建了带有默认编码的字节63?如我所说,如果将字符串转换为无法存储BOM的编码。或者,一般来说,如果您的字符串包含无法转换为目标字符集的任何字符,系统会将其转换为
。事实上,它然后变得可见只是一个副作用!谢谢这就解释了意外的问号;)所以我需要清理这些值。。