首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >读文本编码问题

读文本编码问题
EN

Stack Overflow用户
提问于 2016-04-12 09:33:07
回答 2查看 1.1K关注 0票数 0

我读过一个特定的纯文本文件(csv),我对xA0有一个问题。

Visual Studio 2015:

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

所以似乎是这个不破空间,所以我尝试了

代码语言:javascript
复制
temp = temp.Replace("\xA0", string.Empty);

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

代码语言:javascript
复制
System.IO.StreamReader sr = new System.IO.StreamReader(csvFile.FileContent);

使用特定的utf-8编码:

代码语言:javascript
复制
System.IO.StreamReader sr = new System.IO.StreamReader(csvFile.FileContent, System.Text.Encoding.UTF8);

两人都给出了同样的结果。我真的不喜欢char编码,我需要一些帮助和解释我的错误。

编辑添加了notepad++十六进制视图:(确认它是不中断的字符)

edit2将流读取器构造函数值更改为:

代码语言:javascript
复制
System.IO.StreamReader sr = new System.IO.StreamReader(csvFile.FileContent, true);

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

代码语言:javascript
复制
Encoding.UTF8.GetString(Encoding.GetEncoding("iso-8859-1").GetBytes(temp))
EN

回答 2

Stack Overflow用户

发布于 2016-04-12 09:38:04

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

就像这样:

代码语言:javascript
复制
string[] data = File.ReadAllLines(yourSavePath); 
File.WriteAllLines(yourSavePath, data);

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

票数 0
EN

Stack Overflow用户

发布于 2016-04-12 10:12:21

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

代码语言:javascript
复制
var latin1= Encoding.GetEncoding("iso-8859-1");
var sr = new System.IO.StreamReader(csvFile.FileContent, latin1);

例如,对于输入数组:

代码语言:javascript
复制
byte[] values={0x53,0x34,0x35,0x3b,0x35,0x31,0xa0,0xa0,0xa0,0xa0,0xa0};

UTF8返回

代码语言:javascript
复制
var s1=Encoding.UTF8.GetString(values);
Console.WriteLine(s1);

S45;51�����

而Latin1则返回有效的字符串

代码语言:javascript
复制
var s2=latin1.GetString(values);
Console.WriteLine(s2);

S45;51

.NET对字符串使用Unicode,默认情况下使用UTF8读取文本文件。例如,流读物构造函数默认为UTF8:

代码语言:javascript
复制
    public StreamReader(Stream stream) 
        : this(stream, true) {
    }

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

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

代码语言:javascript
复制
var sr = new System.IO.StreamReader(csvFile.FileContent, Encoding.Default);

许多西欧和英语国家确实使用了这种编码方式,因此系统的区域设置可以预计为Latin1。然而,在进口工作中,这是一个冒险的假设。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36569218

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档