C#File Method无法读取重音字符

时间:2014-06-16 16:12:17

标签: c# sql sql-server-2008 tsql

我正在使用C#自动为用户表插入命令,并且有一个用户的名字带有重音E,我相信有一个坟墓?

Desirée

每当它进入SQL Server表时,它显示为:

Desir?e

我应该在此列上使用哪种数据类型,以确保它保留重音e?

我尝试过varchar和nvarchar,似乎都不重要。

插入代码:

var lines = File.ReadAllLines(users_feed_file);

我认为存在编码问题。当Visual Studio读取我的文件时,它将名称读为Desir?e

到目前为止,我尝试使用以下方法重载File方法:

Encoding enc = new UTF8Encoding(true, true);
var lines = File.ReadAllLines(users_feed_file,enc);

但这没有效果。

var lines = File.ReadAllLines(users_feed_file, Encoding.UTF8);

也不起作用。

2 个答案:

答案 0 :(得分:0)

Sql Server将unicode文本存储为Unicode-2或UTF-16。也就是说,它对所有字符使用固定的两个字节。 UTF-8对所有字符使用可变的三字节,根据需要使用一个,两个或三个字节。如果问题中的字符(最好发布实际的unicode值)由UTF-8翻译成三个字节,那么Sql Server会将其读回两个双字节字符,其中一个可能不是有效的,可显示的字符,从而呈现问号。请注意,Sql Server不存储问号,这就是您使用的文本编辑器呈现这个乱码的方式。

尝试将您的C#编码更改为Encoding.Unicode,看看是否有助于对相关字符进行往返。

同样的推理适用于应该适合一个字节的字符,但是用UTF-8表示两个字符。因此,例如,具有严重性的小e的unicode十六进制值为xE8,其中可以以两个字节表示为00 E8。但UTF-8将其呈现为C3 E8。现在,用Unicode(UTF-16)查找该值 - 没有这样的字符。所以在这种情况下,不是两个字节表示为三个,而是一个字节错误地表示为两个。在尝试调试扩展字符问题时,This resource非常有用。

请注意,对于基本的Latin ascii集,UTF-8使用与Unicode相同的值,因此这些字符往返就好了。使用扩展字符集时,无法保证两种编码的兼容性。

答案 1 :(得分:0)

您可以尝试使用此代码:

var lines = File.ReadAllLines(users_feed_file, Encoding.Unicode);

但是在记事本中你可以查看文件编码,检查一下。