Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > Как определить кодировку текстового файла...


Автор: RUVATA 31.1.2011, 15:27
Всем доброго времени суток...

Суть проблемы...
есть текстовый файл в который был перенаправленный вывод утилиты командной строки...
кодировка получается у нас DOS-866 (если не ошибаюсь)

Задача: считать содержимое, в переменную, перегнать кодировку в Unicode

Вопросов назрела целая куча:
Во первых - в среде .NET  а именно на в vb.NET, есть ли классы которые помогут разобраться с кодировкой файла а именно ее узнать...
в Java например есть функция которая определяет кодировку целевого файла на основе его метки порядка байтов, а в .NET поиск по справке привел меня к 
EncodingHelper.GetEncoding - метод
Visual Studio 2010
Пространство имен:  Microsoft.VisualStudio.TextTemplating
Сборка:  Microsoft.VisualStudio.TextTemplating.10.0 (в Microsoft.VisualStudio.TextTemplating.10.0.dll)

Но у мя все равно ничего не вышло, я ели ели сборук таку нашел и к проекту притянул за уши, тау и в последствии Visual Studio 2010 кажет 
"что нет там таких классов"

Во вторых - хер с ним с определением, пускай мы знаем наперед кодировку... таки и как ее конвертить
вот таку функцию накидал, а ничерта она не конвертит... хотя че-т меняется но по сути мы просто получили ? взамен кирилических символов в DOS-866

Код

Public Function DOS_to_UNICODE(ByVal DosStr As String) As String
        Dim bytes_in() As Byte
        Dim bytes_out() As Byte

        bytes_in = System.Text.Encoding.GetEncoding(866).GetBytes(DosStr)
        bytes_out = System.Text.Encoding.Convert(System.Text.Encoding.GetEncoding(866), System.Text.Encoding.Unicode, bytes_in)
        DOS_to_UNICODE = System.Text.Encoding.Unicode.GetString(bytes_out)

End Function

я ей на вход StreamReader.ReadToEnd из файлика... подсосвывал.

 smile  УАЩЕ ЗАДОЛБАЛСЯ... или я че-т не догоняю... но трахаюсь с .NET уже по второму казалось бы банальному вопросу. 

Автор: cream 31.1.2011, 17:29
RUVATA, вместо этого:
Код

bytes_out = System.Text.Encoding.Convert(System.Text.Encoding.GetEncoding(866), System.Text.Encoding.Unicode, bytes_in)

попробуйте это:
Код

bytes_out = System.Text.Encoding.Convert(System.Text.Encoding.GetEncoding(866), System.Text.Encoding.GetEncoding(1200), bytes_in)

Автор: jonie 31.1.2011, 22:58
win1251-koi8-866 на основе статистики http://www.delphisources.ru/pages/faq/base/autodetect_text_coding.html

многбайтовые на основе BOM-а (считайте первые три байта да и сравните руками)...

Автор: RUVATA 1.2.2011, 08:24
А я в итоге понял одну тонкость... тут ведь как устроенно - StreamReader по умолчанию читает в Unicode, чтобы адекватно манипулировать кодировками, необходимо явно ее указать еще на этапе считывания/инициализации экземпляра StreamReader, например чтобы зачитать некий test.txt (DOS 866) необходим вот такой конструктор экз.
Код

Dim MyReader As New StreamReader(System.Windows.Forms.Application.StartupPath & "\test.txt", encoding:=System.Text.Encoding.GetEncoding(866))

В таком случае моя функция
Код

Public Function DOS_to_UNICODE(ByVal DosStr As String) As String
        Dim bytes_in() As Byte
        Dim bytes_out() As Byte
        bytes_in = System.Text.Encoding.GetEncoding(866).GetBytes(DosStr)
        bytes_out = System.Text.Encoding.Convert(System.Text.Encoding.GetEncoding(866), System.Text.Encoding.Unicode, bytes_in)
        DOS_to_UNICODE = System.Text.Encoding.Unicode.GetString(bytes_out)
End Function

 отрабатывает, отлично ... да и для нормального вывода кириллических символов полученного теста во всякие Label, TextBox, GirdView перекодировка в Unicode не понадобится.
вот так...

Автор: jonie 1.2.2011, 13:51
Цитата(RUVATA @  1.2.2011,  08:24 Найти цитируемый пост)
а и для нормального вывода кириллических символов полученного теста во всякие Label, TextBox, GirdView перекодировка в Unicode не понадобится.

... ибо при считывании и будет производится....

Автор: RUVATA 1.2.2011, 15:41
Цитата

... ибо при считывании и будет производится.... 

smile ну так, не нам-жо кодить, да обумовать сию проблему smile
Всем спасибо...

Автор: cream 1.2.2011, 19:41
Цитата(RUVATA @  1.2.2011,  08:24 Найти цитируемый пост)
...StreamReader по умолчанию читает в Unicode,...

Немного не так.
StreamReader читает UTF8, пропет System.Text.Encoding.Unicode - это UTF16 LE.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)