从文件中读取c#中的特殊字符

时间:2018-03-19 14:41:24

标签: c#

我有一个文本文件,其中包含以下字符串之一。

  Match List ? I and List ? II and identify the correct code :

我在C#中有以下代码来读取这一行,当我在console.write它时,我得到了

 – and - are different!
经过仔细审查,我明白了:

       string filefullnamepath = @"E:\PROJECTS\NETSLET\Console\Console\files\sample.txt";
        string filecontents = "";
        using (StreamReader sr = System.IO.File.OpenText(filefullnamepath))
        {
            filecontents = sr.ReadToEnd();
        }

现在我如何阅读文件并准确地获取文件?我需要将数据存储在数据库中。

我的代码:

 Console.OutputEncoding = System.Text.Encoding.UTF8;

好的,我添加了以下一行:

Save()

现在我得到enter image description here

我需要将内容存储在数据库中。即使在数据库中它也存储为?我正在使用ms-sql server 2018r2

1 个答案:

答案 0 :(得分:1)

首先,检查你读了什么(你有正确的编码吗?):

  string path = @"E:\PROJECTS\NETSLET\Console\Console\files\sample.txt";

  // Easier way to read than Streams
  string fileContent = File.ReadAllText(path);

  string dump = string.Concat(fileContent
    .Select(c =>  c < 32 || c > 127 
       ? $"\\u{(int)c:x4}"  // Encode command chars and unicode ones
       : c.ToString()));    // preserve ASCII intact

  Console.Write(dump);

如果你得到(请注意\u2013个字符)

  Match List \u2013 I and List \u2013 II and identify the correct code :

然后读取是正确的,并且输出是错误的。您应该更改正在使用的字体。如果转储不像上面那样,但是(请注意?):

  Match List ? I and List ? II and identify the correct code :

这意味着系统无法读取字符,因此将其替换为?;所以问题在于阅读,是在编码中。尝试明确地说明

  // Utf-8
  string fileContent = File.ReadAllText(path, Encoding.UTF8);
  ...
  // Win-1250 
  string fileContent = File.ReadAllText(path, Encoding.GetEncoding(1250));

修改:更糟糕的情况是,当您无法保存具有所需编码的文件时,您必须猜测您可以尝试自动化该过程的原始文件:

  string path = "";

  var tries = Encoding.GetEncodings()
    .Select(encoding => new {
       encoding = encoding,
       text = File.ReadAllText(path, encoding.GetEncoding()),  
     } )  
    .Select(item => $"{item.encoding.Name,-8} => {item.text} <- {(item.text.Any(c => c == 0x2013 ? "got it!" : "wrong"))}");

  Console.WriteLine(string.Join(Environment.NewLine, tries));

可能的输出:

  IBM037  => Match List ? I and List ? II and identify the correct code :  <- wrong
  IBM437  => Match List ? I and List ? II and identify the correct code :  <- wrong 
  ...
  windows-1250 => Match List – I and List – II and identify the correct code :  <- got it! 
  ...
  utf-8   => Match List ? I and List ? II and identify the correct code :  <- wrong