52 / 52 / 25
Регистрация: 01.02.2014
Сообщений: 201
1

Как автоматически определить кодировку при открытии текстового файла?

22.11.2014, 16:42. Показов 8100. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть прорамма типа блокнот. Для текста используется RTB.
После открытия файла у пользователя есть возможность поменять кодировку в менюшке. При выборе пункта меню в процедуру, что приведена ниже передается параметр "Kodirovka", который говорит с какой кодировкой переоткрыть файл. Вопрос: как определить кодировку автоматически и открыть с правильной кодировкой?
Открываться могут, как обычные Txt файлы, так и Rtf.
VB.NET
1
2
3
4
5
6
7
            If Kodirovka = "Utf8-Anci" Then
                RTB.LoadFile(FilePath, RichTextBoxStreamType.PlainText)
            ElseIf Kodirovka = "Unicode" Then
                RTB.Text = IO.File.ReadAllText(FilePath, Encoding.Unicode)
            Else 'utf8 bom
                RTB.Text = IO.File.ReadAllText(FilePath, Encoding.UTF8)
            End If
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.11.2014, 16:42
Ответы с готовыми решениями:

Как изменить кодировку при открытии файла
Пишу блокнот Открываю txt файл а у меня квадратики(( как изменить кодировку?? помогите VB 10...

Как указать кодировку при чтении текстового файла
Я пишу некий парсер логов. Указываю строковое значение, например "образец1", выбираю несколько...

Как автоматически при открытии файла скрыть строки?
всем привет. есть такая задумка на листе представлены много всяких таблиц и есть кнопка, при...

Как в Delphi создать программу, требующую пароль при открытии текстового файла?
Желательно если кто-нибудь напишет мне готовый код программы!!! Буду очень признательна!!! Я теперь...

15
395 / 314 / 53
Регистрация: 14.08.2014
Сообщений: 1,010
22.11.2014, 17:02 2
Visualist,
VB.NET
1
RTB.Text = IO.File.ReadAllText(FilePath, Encoding.Default)
Вроде так. Студии сейчас под рукой нет, точнее сказать не могу.
Т.е. суть в том, что за место utf8, unicode или 1251 пишется Default, т.е. кодировка по умолчанию.
1
52 / 52 / 25
Регистрация: 01.02.2014
Сообщений: 201
22.11.2014, 17:09  [ТС] 3
Цитата Сообщение от Дядя Корней Посмотреть сообщение
Default, т.е. кодировка по умолчанию.
пробовал когда-то, ушел от этого, т.к. Default в винде, точно не помню, но по моему - это ANCI.
и если написать RTB.Text = IO.File.ReadAllText(FilePath, Encoding.Default), то не откроется ни UTF8, ни Unicode.
0
4407 / 3531 / 843
Регистрация: 02.02.2013
Сообщений: 3,417
Записей в блоге: 2
22.11.2014, 20:14 4
Думаю, что это можно сделать так
VB.NET
1
2
3
4
5
6
7
8
9
10
Dim bt() As Byte = File.ReadAllBytes("C:\01\_anci.txt")
Dim Txt As String = String.Empty
If bt(0) = 255 AndAlso bt(1) = 254 Then
    Txt = Encoding.Unicode.GetString(bt)
ElseIf bt(0) = 239 AndAlso bt(1) = 187 And bt(2) = 191 Then
    Txt = Encoding.UTF8.GetString(bt)
Else
    Txt = Encoding.Default.GetString(bt)
End If
RichTextBox1.Text = Txt
Добавлено через 2 минуты
Откуда берутся эти коды
VB.NET
1
2
3
4
Dim _unicode As Encoding = Encoding.Unicode
Dim preamble As Byte() = _unicode.GetPreamble()
Dim _utf8 As Encoding = Encoding.UTF8
Dim preamble8 As Byte() = _utf8.GetPreamble()
1
1589 / 662 / 225
Регистрация: 09.06.2011
Сообщений: 1,334
22.11.2014, 20:37 5
Цитата Сообщение от ovva Посмотреть сообщение
Думаю, что это можно сделать так
это лишь проверка на BOM коды. Для файла без них необходимо просматривать все его содержимое в поисках характерных последовательностей для кодировок.
1
Администратор
Эксперт .NET
16992 / 13350 / 5211
Регистрация: 17.03.2014
Сообщений: 27,302
Записей в блоге: 1
22.11.2014, 20:49 6
Visualist, в текстовых файлах не хранится информация о их кодировке. За исключением случая с кодировками Unicode где в файле может быть BOM и тогда .NET автоматически учтет его значение. Для остальных файлов кодировку придется угадывать. Например, с помощью библиотеки ude.
1
52 / 52 / 25
Регистрация: 01.02.2014
Сообщений: 201
23.11.2014, 16:35  [ТС] 7
OwenGlendower, не совсем понятно, как с этой библиотекой работать, она мне может выдать тип кодировки моего текста?
0
Администратор
Эксперт .NET
16992 / 13350 / 5211
Регистрация: 17.03.2014
Сообщений: 27,302
Записей в блоге: 1
23.11.2014, 17:51 8
Visualist, ude поможет угадать название кодировки и ты сможешь открыть файл в правильной кодировке. Очевидно можно написать функцию которая угадывает кодировку и создает StreamReader:
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Function GetStreamReader(ByVal path) As StreamReader
    Dim stream As FileStream = Nothing
 
    Try
        stream = File.OpenRead(path)
 
        Dim fileEncoding As Encoding = Encoding.UTF8
        Dim detector As New CharsetDetector
        detector.Feed(stream)
        detector.DataEnd()
        If detector.Charset IsNot Nothing Then
            fileEncoding = Encoding.GetEncoding(detector.Charset)
        End If
 
        stream.Position = 0
        Return New StreamReader(stream, fileEncoding)
    Catch
        If stream IsNot Nothing Then stream.Close()
 
        Throw
    End Try
 
End Function
Проверь только как она работает c RTF текстом. Мне кажется что внутри RTF есть тег где можно указать кодировку. Возможно для RTF стоит написать отдельный код для определения кодировки.
1
52 / 52 / 25
Регистрация: 01.02.2014
Сообщений: 201
23.11.2014, 19:19  [ТС] 9
OwenGlendower, создал новый проект, чтобы потестить ваш код. Мне подчеркнуло CharsetDetector. Я так понимаю, это объект из библиотеки "Ude" и ее нужно как то включить в мой проект. Делал я это только 1 раз когда-то, я библиотеку dll ложил в папку с программой и потом подключал через ссылку.
В данном случае непонятно как подключить...
Или это иначе как-то делается? Обьясните пожалуйста.
0
Администратор
Эксперт .NET
16992 / 13350 / 5211
Регистрация: 17.03.2014
Сообщений: 27,302
Записей в блоге: 1
23.11.2014, 21:01 10
Лучший ответ Сообщение было отмечено Visualist как решение

Решение

Visualist, добавь ссылку через NuGet (UDE.CSharp) или скачай исходники, откомпилируй, положи её рядом с solution, и добавь reference.
1
52 / 52 / 25
Регистрация: 01.02.2014
Сообщений: 201
23.11.2014, 22:35  [ТС] 11
Цитата Сообщение от OwenGlendower Посмотреть сообщение
скачай исходники, откомпилируй, положи её рядом с solution, и добавь reference
так и сделал. а можно как-то сделать, чтобы не таскать за программкой dll-ки?
p.s. не понял, как добавлять ссылку через NuGet
0
Администратор
Эксперт .NET
16992 / 13350 / 5211
Регистрация: 17.03.2014
Сообщений: 27,302
Записей в блоге: 1
23.11.2014, 22:59 12
Цитата Сообщение от Visualist Посмотреть сообщение
так и сделал. а можно как-то сделать, чтобы не таскать за программкой dll-ки?
Если в рамках одного компьютера, то путем добавления GAC, что в данном случае не подойдет из-за отсутствия строгого имени. Между разными компьютерами с помощью ILMerge или прямым включением исходников в проект. Только вот непонятно чем тебе dll-ки мешают?

Цитата Сообщение от Visualist Посмотреть сообщение
p.s. не понял, как добавлять ссылку через NuGet
Через диалог или консоль команд.
1
52 / 52 / 25
Регистрация: 01.02.2014
Сообщений: 201
23.11.2014, 23:25  [ТС] 13
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Только вот непонятно чем тебе dll-ки мешают?
В принципе, ничем не мешают, но все же... один файл - не два
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Через диалог или консоль команд.
Допустим, добавляю через диалог. В обозревателе решений я выделяю мой проект -> Управление пакетами NuGet. Дальше ищу там UDE.CSharp, нахожу и устанавливаю. Она появляется в папке packages, что рядом с моим проектом. Но суть та же, мне нужно найти там Ude.dll и положить рядом с моим exe-шником и так же добавить ссылку. Правильно?
0
Администратор
Эксперт .NET
16992 / 13350 / 5211
Регистрация: 17.03.2014
Сообщений: 27,302
Записей в блоге: 1
23.11.2014, 23:41 14
Цитата Сообщение от Visualist Посмотреть сообщение
В принципе, ничем не мешают, но все же... один файл - не два
Мой совет - не парься по этому поводу.

Цитата Сообщение от Visualist Посмотреть сообщение
Но суть та же, мне нужно найти там Ude.dll и положить рядом с моим exe-шником и так же добавить ссылку. Правильно?
Нет. Больше ничего делать не надо. NuGet ссылку уже добавил и dll-ка будет автоматически копироваться в выходную папку.

Главное не забывай что ссылки добавленные через NuGet лучше удалять тоже через NuGet.
1
39 / 39 / 8
Регистрация: 15.08.2014
Сообщений: 625
24.09.2015, 10:29 15
OwenGlendower
Не трудно подправить листинг под VB6?
0
Администратор
Эксперт .NET
16992 / 13350 / 5211
Регистрация: 17.03.2014
Сообщений: 27,302
Записей в блоге: 1
24.09.2015, 13:25 16
kreotodr, мне - трудно т.к. я не знаю VB6. Кроме того код использует .NET библиотеку UDE.CSharp поэтому кроме переделки примера нужно будет переписать и её. Насколько я знаю VB6 хорошо работает с COM. В Windows есть встроенный функционал для определения кодировок на основе интерфейса IMultiLang2. Поищи примеры его использования.
1
24.09.2015, 13:25
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.09.2015, 13:25
Помогаю со студенческими работами здесь

Выполнить автоматически команды при открытии файла .c в Vim
Как сделать, так чтобы при создании файла с расширением .c, выполнял комбинацию 2ух кнопок автоматом

Error 105 при открытии текстового файла
Выдается на 8 строке. First chance exception at $7548B727. Exception class EInOutError with...

Заполнение таблицы при открытии из текстового файла
Всем доброе утро. Помогите вот с таким вопросом. Имеется файл эксель. В нем три листа...

Проблема при открытии текстового файла-базы
Dim cn Dim rs As New ADODB.Recordset Set cn = CreateObject('ADODB.Connection') cn.Open...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru