C# 如何在.NET中确定字符串的编码?
我在两台不同的计算机(从源代码管理获取)上运行完全相同的代码(以及连接字符串等) 代码查询数据库(使用Dapper),并从中读取字符串 然而,关于口音的行为是不一样的 在机器A上,DB字符串C# 如何在.NET中确定字符串的编码?,c#,.net,C#,.net,我在两台不同的计算机(从源代码管理获取)上运行完全相同的代码(以及连接字符串等) 代码查询数据库(使用Dapper),并从中读取字符串 然而,关于口音的行为是不一样的 在机器A上,DB字符串'régime'作为'régime' 在机器B上,DB字符串'régime'作为'r获取�gime'(U+FFFD) 行为似乎是在编译时确定的(即,如果我在机器A上编译代码,并在机器B上运行,它会正确读取字符串;如果我在机器B上编译代码,并在机器A上运行,它不会) 我的想法快用完了。。。有人能给我指一下正确的
'régime'
作为'régime'
在机器B上,DB字符串'régime'
作为'r获取�gime'
(U+FFFD)
行为似乎是在编译时确定的(即,如果我在机器A上编译代码,并在机器B上运行,它会正确读取字符串;如果我在机器B上编译代码,并在机器A上运行,它不会)
我的想法快用完了。。。有人能给我指一下正确的方向吗
在.NET Framework 4和早期版本中,默认情况下,所有线程的区域性都设置为Windows系统区域性
它接着说,在4之后的版本中,应用程序域默认区域性为空。其次是:
除非显式设置,否则DefaultThreadCurrentCulture属性的值为null,并且应用程序域中未分配显式区域性的线程的区域性由默认Windows系统区域性定义
这意味着,如果尚未明确设置应用程序域的默认区域性,则继承该值的所有线程都将使用Windows系统区域性设置,无论.net framework版本如何
我怀疑您没有为运行问题操作的线程明确定义区域性
在这种情况下,线程的区域性基于编译线程的计算机上定义的Windows系统区域性
尝试在有问题的两台计算机上定位系统区域性设置,并显式定义线程的区域性
具体到问题的编码部分:
U+FFFD� 替换字符用于替换未知、无法识别或不可表示的字符
由于区域性设置,此处的键不可表示。结果表明,这两台计算机没有使用相同版本的ADO驱动程序连接到数据库,只关闭了一个版本 新版本的补丁说明如下: 数据提供程序中没有标准字符显示问号
禁用引用的“Copy Local”(复制本地)可以获得单个计算机的组合行为,无论程序编译在何处。C#中的字符串始终(内部)编码为UTF-16。这可能与语言无关,与数据层代码(即Dapper和/或SQL Server本身)无关,甚至可能与表示代码或控制台代码页无关。没有更多的上下文,很难说。对于初学者,请验证您在两台机器上使用的是相同版本的Dapper包,并将DB模式并排进行比较。发布列定义。如果您在运行时从文件中获取字符串,则在编译后查看该文件,并查看是否有一个文件在编译过程后被修改并使用不同的编码头重新保存,这将非常有趣。如中所示,两个系统在二进制级别生成的文本文件是相同的。如果您正在从文件中读取此名称,我认为这需要一个。看看你能不能除掉Dapper。你实际上没有提供任何信息。什么数据库(sql server、postresql等),什么列类型?用于查询的代码?所有这些都与运行时行为有关。OP声称它是在编译时确定的。该行为表明确定系统的默认区域性是在编译时完成的。我没有发现任何确凿的证据来证实或反驳这一点。一切都表明,获取特定于区域性的资源是在运行时完成的。基于它在两台计算机上工作的情况,如果代码是在机器A上编译的,可以肯定地说两台机器都有区域性数据,但在机器B上,应用程序没有选择正确的作为默认值。您可以在windows文件系统中看到许多不同的区域性信息包。该应用程序只显示从哪个位置读取。