转换已经格式错误的字符串

时间:2016-07-28 11:01:17

标签: c# encoding utf-8 streamreader decoding

我有一个类,它使用另一个读取Textfile的类。 Textfile是用Ascii编写的,或者是CP1525。

背景信息: Textfile在Axapta中生成,并使用ASCIIio类,该类使用writeRaw方法写入文本

我正在使用的类是由同事,他正在使用C#StreamReader来读取文件。通常这样可以正常工作,因为文件是用UTF8编写的,但在这种特殊情况下它不是。

因此Streamreader将文件读取为UTF8并将读取的字符串传递给我。 我现在有一些信件,例如带有Diaeresis(ö)的Lating小写字母o,它们没有按照我需要的格式编写。

在这种情况下,字符串的简单转换没有帮助,我无法弄清楚如何得到正确的字母。

所以这基本上就是他的阅读方式:

char quotationChar = '"';
String line = "";
using (StreamReader reader = new StreamReader(fileName))
{
    if((line = reader.ReadLine()) != null)
    {
        line = line.Replace(quotationChar.ToString(), "");
    }
}
return line;

现在发生的是,在文本文件中,我有德语单词“Röhre”,在用流读取器读取之后,转换为R hre(在数据库中看起来很愚蠢)。

我可以尝试转换每个字母

Encoding enc = Encoding.GetEncoding(1252); 
byte[] utf8_Bytes = new byte[line.Length];
for (int i = 0; i < line.Length; ++i)
{
    utf8_Bytes[i] = (byte)line[i];
}
String propEncodeString = enc.GetString(utf8_Bytes, 0, utf8_Bytes.Length);

这不能给我正确的角色!

byte[] myarr = Encoding.UTF8.GetBytes(line);
String propEncodeString = enc.GetString(myarr);

这也会返回错误的字符。

我知道我可以通过使用它来解决问题:

using (StreamReader reader = new StreamReader(fileName, Encoding.Default, true))

但只是为了好玩: 如何从已经错误解码的字符串中获取正确的字符串?

1 个答案:

答案 0 :(得分:1)

首次进行UTF8到ASCII转换后,所有不映射到有效ASCII条目的字符都将替换为相同的错误数据字符,这意味着数据刚刚丢失,您不能简单地& #39;转换&#39;回到下游的好人物。请参阅此示例:https://dotnetfiddle.net/XWysml