2016-07-28 3 views
0

У меня есть класс, который использует другой класс, который читает текстовый файл. Текстовый файл написан в Ascii или должен быть прозрачным CP1525.Преобразование строки, которая уже некорректна

Информация

фона: текстового файла генерируется в Axapta и использует класс ASCIIio который записывает текст с помощью метода writeRaw

Класс, который я использую на коллегу, и он использует C# StreamReader для чтения файлов. Обычно это работает нормально, потому что файлы написаны в UTF8, но в этом конкретном случае это не так.

Таким образом, Streamreader считывает файл как UTF8 и передает мне прочитанную строку. Теперь у меня есть несколько букв, например, маленькая буква Lating с Diaeresis (ö), которые не сформированы так, как мне бы хотелось.

Простой конвертер строки в этом случае не помогает, и я не могу понять, как я могу получить правильные буквы.

Так что это в основном, как он читает:

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

Что теперь происходит, в Textfile у меня есть немецкое слово «ROHRE», который, прочитав его с StreamReader, превращающий в Rhre (который выглядит глупо в базе данных).

Я мог бы попытаться преобразовать каждую букву

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

После преобразования UTF8 в ASCII, все символы, которые не отображаются на действительные записи ASCII, заменяются тем же символом плохих данных, что означает, что данные просто потеряны, и вы не можете просто «конвертировать», назад к хорошему персонажу вниз по течению. См. Этот пример: https://dotnetfiddle.net/XWysml

+0

Я пришел из ASCII и преобразовал его в UTF8, а не наоборот. Но проблема остается той же, что я знаю. – Bongo

+1

@Bongo UTF8 имеет символ «Я не знаю, что это», который использует для замены неправильно понятых байтов. Это как раскрасить странные кусочки изображения красным цветом, а затем спросить, что находится под ним? –