如何在.NET中确定字符串的编码?

时间:2018-04-23 16:38:28

标签: c# .net

我在两台不同的计算机上运行完全相同的代码(和连接字符串等)(从源代码控制中获取)。

代码查询DB(使用Dapper),并从中读取字符串。

但是,有关重音的行为并不相同。

在计算机A上,数据库字符串'régime'被提取为'régime'

在机器B上,数据库字符串'régime'被取为'r�gime'(U + FFFD)。

行为似乎是在编译时确定的(即如果我在机器A上编译代码,并在机器B上运行它,它正确读取字符串,如果我在机器B上编译它并在机器上运行它A,它没有。)

我的想法已经用完了...有人能指出我正确的方向吗?

2 个答案:

答案 0 :(得分:2)

来自https://msdn.microsoft.com/en-us/library/system.globalization.cultureinfo.defaultthreadcurrentculture(v=vs.110).aspx

  

在.NET Framework 4和早期版本中,默认情况下,所有线程的文化都设置为Windows系统文化

接着说,在4之后的版本中,app域默认文化为null。其次是:

  

除非明确设置,否则DefaultThreadCurrentCulture属性的值为null,并且默认Windows系统文化定义了尚未分配显式区域性的应用程序域中的线程区域。

这意味着如果您没有明确设置应用程序域的默认文化,那么继承该值的所有线程都将使用Windows系统文化设置,而不管.net框架版本。

我怀疑你没有明确定义运行问题操作的线程的文化。

在这种情况下,线程的文化基于在其编译的机器上定义的Windows系统文化。

尝试在相关的两台计算机上找到系统区域设置,并明确定义线程的区域性。

特定于问题的ENCODING部分:

  

U + FFFD�替换字符用于替换未知,无法识别或无法代表的字符

由于文化背景,这里的关键是无法代表。

答案 1 :(得分:1)

事实证明,两台机器没有使用相同版本的ADO驱动程序来连接数据库,而是由一个版本关闭。

新版本的补丁说明如下:

  

DataProvider中没有标准字符显示问号

禁用“复制本地”作为引用,无论程序编译在何处,都可以获得单个计算机的组合行为。