Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как определить кодировку текстового файла... 
V
    Опции темы
RUVATA
Дата 31.1.2011, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 68
Регистрация: 24.8.2010

Репутация: нет
Всего: нет



Всем доброго времени суток...

Суть проблемы...
есть текстовый файл в который был перенаправленный вывод утилиты командной строки...
кодировка получается у нас 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 уже по второму казалось бы банальному вопросу. 
PM MAIL   Вверх
cream
Дата 31.1.2011, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 23.7.2010

Репутация: 1
Всего: 1



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)


Это сообщение отредактировал(а) cream - 31.1.2011, 17:39
PM MAIL   Вверх
jonie
Дата 31.1.2011, 22:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 6
Всего: 118



win1251-koi8-866 на основе статистики http://www.delphisources.ru/pages/faq/base...ext_coding.html

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


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
RUVATA
Дата 1.2.2011, 08:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 68
Регистрация: 24.8.2010

Репутация: нет
Всего: нет



А я в итоге понял одну тонкость... тут ведь как устроенно - 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 не понадобится.
вот так...


Это сообщение отредактировал(а) RUVATA - 1.2.2011, 08:27
PM MAIL   Вверх
jonie
Дата 1.2.2011, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 6
Всего: 118



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

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


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
RUVATA
Дата 1.2.2011, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 68
Регистрация: 24.8.2010

Репутация: нет
Всего: нет



Цитата

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

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

PM MAIL   Вверх
cream
Дата 1.2.2011, 19:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 23.7.2010

Репутация: 1
Всего: 1



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

Немного не так.
StreamReader читает UTF8, пропет System.Text.Encoding.Unicode - это UTF16 LE.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | .NET для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0708 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.