Кодування проблем

У мене є велика проблема з кодуванням. Код, який я використовую, повинен працювати, але це не так!

Ось код:

FileStream fs = new FileStream(saveFile, FileMode.Create, FileAccess.Write, FileShare.None);

System.IO.StreamWriter objWriter;
objWriter = new System.IO.StreamWriter(fs , Encoding.Unicode);
string textLine;
if (System.IO.File.Exists(readFile) == true)
{
    System.IO.StreamReader objReader;
    objReader = new System.IO.StreamReader(readFile, Encoding.Unicode);

    do 
    {
        textLine = objReader.ReadLine();
        if (textLine.IndexOf(searchString) != -1)
        {
            tempString = textLine;
            position1 = textLine.IndexOf(searchString);

            tempString = textLine.Substring(position1);
            if (tempString.IndexOf("(") != -1)
            {
                position2 = tempString.IndexOf("(");
                //MessageBox.Show(tempString.Length.ToString());
                tempString = tempString.Substring(0, position2);
            }
        }

        objWriter.WriteLine(textLine);
    } while (objReader.Peek() != -1);
}
objWriter.Close();
MessageBox.Show(tempString);
MessageBox.Show("Done!");

Я повинен прочитати файл, який має змішані англійські символи та деякі кириличні символи, але після прочитання та обробки файлу, коли я намагаюся зберегти файл у новому місці, всі символи кирилиці є "?" або якийсь інший невідомий символ. Я спробував все можливе кодування, і це не працює!

0
Ви впевнені, що вхідний файл, який ви читаєте, кодується з Unicode?
додано Автор Darin Dimitrov, джерело
Чи можна показати нам текст для цього шістдесяти, або ваше передбачення?
додано Автор Jodrell, джерело
Ви дійсно спробували всі 140 з них? Опублікуйте скріншот переглядача, який показує вміст файлу.
додано Автор Hans Passant, джерело
msdn.microsoft.com/en-us/library/ & hellip; 'Об'єкт UnicodeEncoding, який повертається цим властивістю, може не мати відповідної поведінки для вашої програми. Він використовує заміну для заміни кожного рядка, який він не може кодувати, і кожного байту, який він не може декодувати символом запитання ("?"). '
додано Автор jv42, джерело
Ні, я не впевнений, але протестував всі інші кодування, і результат був таким самим.
додано Автор Jordan, джерело
Для кирилиці не 140, а я тестував всі кириличні. Ось вигляд HEX:
додано Автор Jordan, джерело
61 73 64 61 E4 E4 E0 F1 E4 E0 F1 E4 E0 F1 E4 0D 0A F4 F1 E4 0D 0A F4 E4 0D 0A E3 F4 E4 0D 0A E3 E4 0D 0A F4 E3 0D 0A F4 F5 0D 0A E3 F4 F5 0D 0A E3 E9 0D 0A 0D 0A F5 E9 EA E9 0D 0A 3B EB 0D 0A E5 F0 0D 0A E2 E5 F0 0D 0A 20 E2 0D 0A F0 0D 0A E5 E2 20 E4 F4 E3 20 E4 0D 0A F4 E3 E4 0D 0A F4 E3 20 0D 0A E4 E3 E4 0D 0A F4 E3 20
додано Автор Jordan, джерело
Текст гібриш ... це воно: asdaддасдасдасд фсд фд гфд гд фг фх гфх гй хйкй; л ер кер у р ев дфг д фгд фг ддд фг
додано Автор Jordan, джерело

2 Відповіді

З прикладу, який ви опублікували, здається, що файл не містить BOM, але містить кириличні символи. Без BOM StreamReader не може вгадати правильну кодування. Таким чином, ви можете вважати кодуванням Windows-1251 , оскільки файл містить кириличні символи (відповідно до HEX дамп, який ви показали в розділі коментарів).

Ось що ви можете спробувати:

using (var reader = new StreamReader("input.txt", Encoding.GetEncoding("Windows-1251")))
using (var writer = new StreamWriter("output.txt", false, Encoding.UTF8))
{
    string line;
    while ((line = reader.ReadLine()) != null)
    {
       //reading the input file line by line ...
       //perform the parsing and write to the UTF-8 output encoded file
        writer.WriteLine(line);
    }
}
3
додано
Це працює! ДУЖЕ ДЯКУЮ!
додано Автор Jordan, джерело

Якщо ви не впевнені в кодуванні вашого вхідного файлу, не вказуйте його, не перевіряйте реалізацію StreamReader .

Я підозрюю, що ваш вихідний файл не Unicode , а скоріше за допомогою вашої локальної кодування Windows.

Зробіть абсолютно новий файл і не визначте кодування у читач.

objReader = new System.IO.StreamReader(readFile); 
1
додано
Можливо, ваш вихідний файл має BOM, але вміст не є UTF?!? Яка кодування є вихідним файлом? Якщо ви створюєте абсолютно новий файл із блокнотом і не вказуєте кодування, він повинен працювати.
додано Автор Jodrell, джерело
@ Ханс Пасант, виправлено.
додано Автор Jodrell, джерело
FileStream ніколи не здогадується при кодуванні, він працює тільки з байтами.
додано Автор Hans Passant, джерело
Я зробив це на початку, але так як він не працював, тому я судимий з кодуванням і я зробив випробування всіх можливих кодувань стандартних і всі можливі cyrylic кодування і результат тим же. І я поняття не маю, що робити.
додано Автор Jordan, джерело
Я зробив новий файл, щоб перевірити його, і це не працює.
додано Автор Jordan, джерело
var chat = new Chat();
var chat = new Chat();
642 учасників

Обсуждение вопросов по C# / .NET / .NET Core / .NET Standard / Azure Сообщества-организаторы: — @itkpi — @dncuug