阅读文字编码问题

时间:2016-04-12 09:33:08

标签: c# encoding utf-8

我已阅读某个纯文本文件(csv),我遇到xA0

的问题

Visual Studio 2015:

enter image description here

Notepad ++ :(将char编码设置为utf-8时)

enter image description here

因此似乎是non-breaking space 所以我尝试了this

temp = temp.Replace("\xA0", string.Empty);

但它不起作用并给了我类似于第一个截图的黑色方块。 我也改变了

System.IO.StreamReader sr = new System.IO.StreamReader(csvFile.FileContent);

使用特定的utf-8编码:

System.IO.StreamReader sr = new System.IO.StreamReader(csvFile.FileContent, System.Text.Encoding.UTF8);

两者给出了相同的结果。我真的不喜欢字符编码,可以使用一些关于我的错误的帮助和解释。

编辑添加了记事本++十六进制视图:(确认它是非破坏的字符) enter image description here

edit2 将streamreader构造函数值更改为:

System.IO.StreamReader sr = new System.IO.StreamReader(csvFile.FileContent, true);

导致读取文件的utf-8编码。我尝试将latin1转换为utf-8,但这给了我??? https://stackoverflow.com/a/13999801/169714

Encoding.UTF8.GetString(Encoding.GetEncoding("iso-8859-1").GetBytes(temp))

2 个答案:

答案 0 :(得分:0)

尝试将结果放入字符串中,读取数据并打印出结果

类似的东西:

string[] data = File.ReadAllLines(yourSavePath); 
File.WriteAllLines(yourSavePath, data);

如果我是对的,它应该修复它,这是一个缺少字符的问题

答案 1 :(得分:0)

0xA0是Latin1,iso-8859-1中的不间断空格。您可以通过传递Encoding.GetEncoding("iso-8859-1")作为编码来阅读它:

var latin1= Encoding.GetEncoding("iso-8859-1");
var sr = new System.IO.StreamReader(csvFile.FileContent, latin1);

例如,对于输入数组:

byte[] values={0x53,0x34,0x35,0x3b,0x35,0x31,0xa0,0xa0,0xa0,0xa0,0xa0};

UTF8返回

var s1=Encoding.UTF8.GetString(values);
Console.WriteLine(s1);
  

S45; 51

Latin1返回有效字符串

var s2=latin1.GetString(values);
Console.WriteLine(s2);
  

S45; 51

.NET使用Unicode表示字符串,默认情况下使用UTF8读取文本文件。例如,StreamReader's构造函数默认为UTF8:

    public StreamReader(Stream stream) 
        : this(stream, true) {
    }

    public StreamReader(Stream stream, bool detectEncodingFromByteOrderMarks) 
        : this(stream, Encoding.UTF8, detectEncodingFromByteOrderMarks, DefaultBufferSize, false) {
    }

要使用系统区域设置,必须明确传递Encoding.Default编码。

var sr = new System.IO.StreamReader(csvFile.FileContent, Encoding.Default);

许多西欧和英语国家都使用此编码,因此系统区域设置可能应该是Latin1。这是在进口工作中做出的冒险假设