2009-08-13 76 views
2

在C#中,我正在读取从文本文件插入SQL语句,然后尝试使用ADO.NET在数据库上执行它们。其中一些查询中包含希腊字符。具体来说,Mu(看起来很时髦)用于微秒(usec)。问题在于问号实际上被插入到数据库中(?sec)。但是,我感觉问题在于读取文本文件,因为调试器也在钻石内部显示问号。我正在使用StreamReader的ReadLine方法。我究竟做错了什么?如何从文件中读取特殊字符?

回答

4

问题几乎可以肯定的是,当你读取文件时,你使用了错误的编码。你知道什么编码你的文本文件实际上是在?大多数.NET API默认使用UTF-8,但您的文件可能在处于操作系统的默认编码中,该编码由Encoding.Default表示。试试这个:

using (StreamReader reader = new StreamReader(filename, Encoding.Default)) 
{ 
    ... 
} 

我也强烈建议您尝试得到它的工作而不触及数据库。阅读文件中,然后打印出字符串中的字符在他们的Unicode编码方面:

public static void DumpString(string text) 
{ 
    Console.WriteLine("Text: '{0}'", text); 
    foreach (char c in text) 
    { 
     Console.WriteLine("{0}: U+{1:x4}", c, (int) c); 
    } 
} 

如果给出正确的结果,然后尝试将其插入到数据库中。这样,如果数据库之后看起来“错误”,那么您知道问题出在您的数据库访问上,而不是文件访问上。

+0

这似乎是伎俩。但是,我不确定我是否理解这整个编码的事情。如果另一个具有不同默认编码的用户修改了该文件,然后我尝试用新文件重新运行我的应用程序,该怎么办?它会不再起作用吗?我应该使用Encoding.UTF8吗? – bsh152s 2009-08-13 21:34:42

+0

使用UTF-8是一个更好的主意,是的 - 但你需要确保你始终知道编码的真正含义。你能确保文件将*永远*保存为UTF-8? – 2009-08-13 22:33:25

2

您需要检查三两件事:

  1. 当你打开的StreamReader
  2. 在数据库服务器上的列类型(nvarchar的,而不是为varchar)
  3. 在该效果的归类中使用的编码列

如果其中任何一个都是错误的,当您从数据库读取数据时会得到错误的值。

相关问题