我在两台不同的计算机上运行完全相同的代码(和连接字符串等)(从源代码控制中获取)。
代码查询DB(使用Dapper),并从中读取字符串。
但是,有关重音的行为并不相同。
在计算机A上,数据库字符串'régime'
被提取为'régime'
在机器B上,数据库字符串'régime'
被取为'r�gime'
(U + FFFD)。
行为似乎是在编译时确定的(即如果我在机器A上编译代码,并在机器B上运行它,它正确读取字符串,如果我在机器B上编译它并在机器上运行它A,它没有。)
我的想法已经用完了...有人能指出我正确的方向吗?
答案 0 :(得分:2)
在.NET Framework 4和早期版本中,默认情况下,所有线程的文化都设置为Windows系统文化
接着说,在4之后的版本中,app域默认文化为null。其次是:
除非明确设置,否则DefaultThreadCurrentCulture属性的值为null,并且默认Windows系统文化定义了尚未分配显式区域性的应用程序域中的线程区域。
这意味着如果您没有明确设置应用程序域的默认文化,那么继承该值的所有线程都将使用Windows系统文化设置,而不管.net框架版本。
我怀疑你没有明确定义运行问题操作的线程的文化。
在这种情况下,线程的文化基于在其编译的机器上定义的Windows系统文化。
尝试在相关的两台计算机上找到系统区域设置,并明确定义线程的区域性。
特定于问题的ENCODING部分:
U + FFFD�替换字符用于替换未知,无法识别或无法代表的字符
由于文化背景,这里的关键是无法代表。
答案 1 :(得分:1)
事实证明,两台机器没有使用相同版本的ADO驱动程序来连接数据库,而是由一个版本关闭。
新版本的补丁说明如下:
DataProvider中没有标准字符显示问号
禁用“复制本地”作为引用,无论程序编译在何处,都可以获得单个计算机的组合行为。