Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
 Аватар для zink0000
258 / 107 / 26
Регистрация: 15.03.2012
Сообщений: 353
Записей в блоге: 35

Признак кодировки Юникод

31.08.2019, 14:27. Показов 2968. Ответов 15

Студворк — интернет-сервис помощи студентам
Программа создаёт два списка, в одном все текстовые файлы в кодировке ANSI, в другом Юникод.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Function bnUnicode(ByVal sFileName As String) As Boolean
  ' bnUnicode - признак кодировки Unicode
  Dim iFn As Integer
  Dim sUnicode As String
  '
  iFn = FreeFile
  Open sFileName For Input As #iFn
  Line Input #iFn, sUnicode
  If Left$(sUnicode, 2) = (Chr$(255) & Chr$(254)) Then
    bnUnicode = True  ' Юникод
  Else
    bnUnicode = False ' ANSI
  End If
  Close #iFn
End Function
Исходник:
TxtUnicode.zip
1
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
31.08.2019, 14:27
Ответы с готовыми решениями:

Глючат кодировки юникод
Hi, all mighty All, Переставил Windows 7 и началась свистопляска: Браузер хром при открытии html страниы на локальном диске кажет...

Конвертирование с кодировки юникод в биты
Добрый день.Пишу сейчас программу по шифрованию и в основе алгоритма нужно считивать текст блоками по 64 бита. Подскажите пожалуйста как...

Как работают кодировки и юникод
Здравствуйте, подскажите, пожалуйста, я не очень понимаю как работают кодировки и юникод. То есть, например, как хранятся символы в...

15
 Аватар для zink0000
258 / 107 / 26
Регистрация: 15.03.2012
Сообщений: 353
Записей в блоге: 35
31.08.2019, 14:34  [ТС]
А теперь - вопрос: есть ли какая-нибудь готовая функция преобразования строки Юникод в ANSI?
0
Эксперт по электронике
6566 / 3193 / 335
Регистрация: 28.10.2011
Сообщений: 12,474
Записей в блоге: 7
31.08.2019, 16:31
Цитата Сообщение от zink0000 Посмотреть сообщение
есть ли какая-нибудь готовая функция преобразования строки Юникод в ANSI?
MultiByteToWideChar.
3
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
31.08.2019, 19:50
Лучший ответ Сообщение было отмечено zink0000 как решение

Решение

StrConv
3
 Аватар для zink0000
258 / 107 / 26
Регистрация: 15.03.2012
Сообщений: 353
Записей в блоге: 35
07.12.2019, 15:16  [ТС]
The trick, спасибо.
Проверил. Всё работает.
Visual Basic
1
sR = StrConv(sT, vbFromUnicode)
Исходник:
StrConvU01.zip

Может и для UTF-8 что-нибудь подобное есть?
1
 Аватар для zink0000
258 / 107 / 26
Регистрация: 15.03.2012
Сообщений: 353
Записей в блоге: 35
08.01.2020, 12:24  [ТС]
Нашёл функцию:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
' §§§§§§§§§§§§§§§§§§§§§§§§§§ APIs §§§§§§§§§§§§§§§§§§§§§§§§§§
Private Declare Function LocalAlloc Lib "kernel32.dll" (ByVal wFlags As Long, ByVal wBytes As Long) As Long
Private Declare Function LocalFree Lib "kernel32.dll" (ByVal hMem As Long) As Long
 
Private Declare Function MultiByteToWideChar Lib "kernel32.dll" (ByVal CodePage As Long, ByVal dwFlags As Long, ByVal lpMultiByteStr As String, ByVal cchMultiByte As Long, ByVal lpWideCharStr As Long, ByVal cchWideChar As Long) As Long
Private Declare Function WideCharToMultiByte Lib "kernel32.dll" (ByVal CodePage As Long, ByVal dwFlags As Long, ByVal lpWideCharStr As Long, ByVal cchWideChar As Long, ByVal lpMultiByteStr As Long, ByVal cchMultiByte As Long, ByVal lpDefaultChar As Long, ByVal lpUsedDefaultChar As Long) As Long
 
Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long)
 
Private Function UTF8ToWin(ByRef inString As String, _
                           ByVal lMaxSize As Long) As String
 
'--------------------------------------------------------------------------------
' Проект     :  OfflineClient
' Процедура  :  UTF8ToWin
' Описание   :  Перевод UTF8 строки в WIN кодировку
' Кем создан :  SNE
' Дата-Время :  09.11.2004-11:56:58
'
' Параметры  :  inString    - Строка в utf8 кодировке
'               lMaxSize    - Максимальный размер строки
'--------------------------------------------------------------------------------
 
        If inString = vbNullString Then Exit Function
 
        Dim hMemLock1   As Long, hMemLock2  As Long
        Dim iStrSize    As Long
 
        hMemLock1 = LocalAlloc(LMEM_ZEROINIT, lMaxSize)
        hMemLock2 = LocalAlloc(LMEM_ZEROINIT, lMaxSize)
 
        iStrSize = MultiByteToWideChar(CP_UTF8, 0&, inString, &HFFFF, hMemLock1, lMaxSize)
        iStrSize = WideCharToMultiByte(0&, 0&, hMemLock1, &HFFFF, hMemLock2, iStrSize, 0&, 0&;)
 
        If VBA.Len(iStrSize) Then
            UTF8ToWin = String$(iStrSize - vbNull, 0&;)
            Call CopyMemory(ByVal UTF8ToWin, ByVal hMemLock2, iStrSize - vbNull)
        End If
 
        Call LocalFree(hMemLock1)
        Call LocalFree(hMemLock2)
End Function
Но есть проблема при работе под операционной системой Windos 7 Максимальная 64-разрядная Service Pack 1 2009 года при попытке конвертировать из UTF-8 в ANSI большого текста программа зависает, а вот отдельные строки конвертирует, правда иногда с ошибками.

Посмотрите исходник:
StrConvU01 2020-01-08.zip

Может я что-то не так делаю?..
1
 Аватар для zink0000
258 / 107 / 26
Регистрация: 15.03.2012
Сообщений: 353
Записей в блоге: 35
08.01.2020, 12:45  [ТС]
Признак кодировки UTF-8 - первые три символа в текстовом файле:

Visual Basic
1
Chr$(239) & Chr$(187) & Chr$(191)
1
 Аватар для zink0000
258 / 107 / 26
Регистрация: 15.03.2012
Сообщений: 353
Записей в блоге: 35
18.01.2020, 13:14  [ТС]
Подпрограмму конвертации UTF-8 в Windows-1251 написал.

Правда ошибку в таблице перекодировки для двух символов допустил, но спасибо TextDiff.exe быстро нашёл и исправил.


Исправлено:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
Public Function sUtfToWin(ByVal sUtf As String) As String
  ' sUtfToWin - Utf To Win
  Dim lI As Long
  Dim lL As Long
  Dim iJ As Integer
  Dim sTmp As String
  Dim sChr As String
  '
  If Not bnInitializeCodePageDone Then
    Call InitializeCodePage
  End If
  sTmp = ""
  lL = Len(sUtf)
  lI = 1
  Do
    ' Цикл без условий (бесконечный)
    If lI > lL Then
      Exit Do
    End If
    sChr = Mid$(sUtf, lI, 1)
    If 0 <= Asc(sChr) And 127 >= Asc(sChr) Then
      ' Символы в диапазоне 0-127 - ничего делать не надо - перекодировка не требуется
      sTmp = sTmp + sChr
      lI = lI + 1
    ElseIf 194 = Asc(sChr) Or 208 = Asc(sChr) Or 209 = Asc(sChr) Or 210 = Asc(sChr) Then
      sChr = Mid$(sUtf, lI, 2)
      For iJ = 0 To 127 Step 1
        If sChr = sUTF8(iJ) Then
          sChr = sANSI(iJ)
          sTmp = sTmp + sChr
          Exit For
        End If
      Next iJ
      lI = lI + 2
    ElseIf 226 = Asc(sChr) Then
      sChr = Mid$(sUtf, lI, 3)
      For iJ = 0 To 127 Step 1
        If sChr = sUTF8(iJ) Then
          sChr = sANSI(iJ)
          sTmp = sTmp + sChr
          Exit For
        End If
      Next iJ
      lI = lI + 3
    Else
      lI = lI + 1
    End If
  Loop
  sUtfToWin = sTmp
End Function
Исходник:
StrConvU02 2020-01-14.zip
1
 Аватар для zink0000
258 / 107 / 26
Регистрация: 15.03.2012
Сообщений: 353
Записей в блоге: 35
18.01.2020, 13:18  [ТС]
А это уже окончательный вариант.
Сам распознаёт тип кодировки и перекодирует в Windows-1251, если файл не UTF-8 и не Unicode - программа ничего не делает.

Исходник:
StrConvU02 2020-01-17.zip
2
 Аватар для zink0000
258 / 107 / 26
Регистрация: 15.03.2012
Сообщений: 353
Записей в блоге: 35
18.01.2020, 13:32  [ТС]
А это программа Fb2Tag01 для которой собственно и нужна конвертация UTF-8 в Win.
Работает с файлами формата FictionBook2

В модуле Tag.bas:
Функция lTagNum - возвращает количество тэгов в строке.
Функция sTagRead - возвращает строку содержащуюся между двух тэгов (первых найденных).
Подпрограмма TagDel - удаляет все строки найденные между заданными тэгами.

Извлекаем содержимое тэгов <author> и <book-title> и переименовываем файл: _ ФИО автора - Название книги.fb2
Пример для программы:
Chirkova_V._Naznachaeshsya1._Naznachaesh sya_Princem_Pr.fb2
Как-то так.

Исходник:
Fb2Tag01 2020-01-17.zip
0
 Аватар для zink0000
258 / 107 / 26
Регистрация: 15.03.2012
Сообщений: 353
Записей в блоге: 35
18.01.2020, 13:41  [ТС]
Fb2Tag02 - обрабатывает папку со всеми подкаталогами.
Можно задавать сразу несколько целевых папок для обработки.



НО! ВНИМАНИЕ! НЕ ДО КОНЦА ОТЛАЖЕНО!
Были случаи пропадали файлы при переименовании или возникали файлы нулевого размера!
(Хорошо что работал с копией папки!!!)

Исходник:
Fb2Tag02 2020-01-17.zip
1
 Аватар для zink0000
258 / 107 / 26
Регистрация: 15.03.2012
Сообщений: 353
Записей в блоге: 35
18.01.2020, 13:53  [ТС]
Да... модуль Tag.bas можно пожалуй и для обработки HTML-файлов использовать...

Добавлено через 3 минуты
И ещё... в Fb2Tag02 надо бы контроль, что файл именно в кодировке UTF-8 прикрутить...
(А то перекодирует... то что не надо...)
Ладно, потом как-нибудь сделаю.
1
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18031 / 7734 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
19.01.2020, 19:14
Надёжнее будет локале-независимая функция:

Visual Basic
1
2
3
4
5
6
7
Public Function HasBOM_UTF16(sText As String) As Boolean
    HasBOM_UTF16 = (AscW(Left$(sText, 1)) = 1103 And (AscW(Mid$(sText, 2, 1)) = 1102))
End Function
 
Public Function HasBOM_UTF8(sText As String) As Boolean
    HasBOM_UTF8 = (AscW(Left$(sText, 1)) = 1087 And (AscW(Mid$(sText, 2, 1)) = 187) And (AscW(Mid$(sText, 3, 1)) = 1111))
End Function
На счёт перекодировки, попробуйте:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
Enum idCodePage
    WIN = 1251
    DOS = 866
    KOI = 20866
    ISO = 28595
    UTF8 = 65001
End Enum
#If False Then
    Dim WIN, DOS, KOI, ISO, UTF8
#End If
 
Private Declare Function MultiByteToWideChar Lib "kernel32.dll" (ByVal CodePage As Long, ByVal dwFlags As Long, ByVal lpMultiByteStr As String, ByVal cchMultiByte As Long, ByVal lpWideCharStr As Long, ByVal cchWideChar As Long) As Long
Private Declare Function WideCharToMultiByte Lib "kernel32.dll" (ByVal CodePage As Long, ByVal dwFlags As Long, ByVal lpWideCharStr As Long, ByVal cchWideChar As Long, ByVal lpMultiByteStr As String, ByVal cchMultiByte As Long, ByVal lpDefaultChar As Long, ByVal lpUsedDefaultChar As Long) As Long
 
Private Function ConvertCodePage(Src As String, inPage As idCodePage, outPage As idCodePage) As String
    On Error GoTo ErrorHandler:
    Dim buf   As String
    Dim Dst   As String
    Dim Size  As Long
    
    Size = MultiByteToWideChar(inPage, 0&, Src, Len(Src), 0&, 0&)
    If Size > 0 Then
        buf = String$(Size, 0)
        Size = MultiByteToWideChar(inPage, 0&, Src, Len(Src), StrPtr(buf), Len(Src))
    
        Size = WideCharToMultiByte(outPage, 0&, StrPtr(buf), Size, ByVal 0&, 0&, 0&, 0&)
        If Size > 0 Then
            Dst = String$(Size, 0)
            Size = WideCharToMultiByte(outPage, 0&, StrPtr(buf), Size, Dst, LenB(Dst), 0&, 0&)
            
            If Size <> 0 Then ConvertCodePage = Left$(Dst, lstrlen(StrPtr(Dst)))
        End If
    End If
    Exit Function
ErrorHandler:
    debug.? "ConvertCodePage", "String:", Src, "In:", CStr(inPage), "Out:", CStr(outPage)
End Function
Visual Basic
1
s = ConvertCodePage(sText, UTF8, WIN)
2
 Аватар для zink0000
258 / 107 / 26
Регистрация: 15.03.2012
Сообщений: 353
Записей в блоге: 35
25.01.2020, 15:23  [ТС]
Dragokas, спасибо.
Код скопировал. Посмотрю.
0
 Аватар для zink0000
258 / 107 / 26
Регистрация: 15.03.2012
Сообщений: 353
Записей в блоге: 35
21.03.2020, 12:59  [ТС]
Модуль Tag.bas можно использовать и для обработки HTML файлов.
HtmlTag01 обрабатывает один файл.

Исходник:
HtmlTag01.zip
0
 Аватар для zink0000
258 / 107 / 26
Регистрация: 15.03.2012
Сообщений: 353
Записей в блоге: 35
21.03.2020, 13:03  [ТС]
А HtmlTag02 соответственно все указанные папки.

Исходник:
HtmlTag02.zip
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.03.2020, 13:03
Помогаю со студенческими работами здесь

Не работает признак окончания ввода(признак-0)
Признак окончания ввода 0; подскажите люди добрые что не так?) #include &lt;iostream&gt; #include&lt;stdio.h&gt; using namespace std; int...

В чём отличия кодировки ms dos от кодировки ms windows?
Всем привет, подскажите в чём отличия кодировки ms dos от кодировки ms windows?

Кодировки (ошибки кодировки) в логировании
Здравствуйте. Работаю с WINAPI и оттуда нормально приходят наименования на русском. Вот решил логирование организовать и на этом повалился...

Юникод в с++
Есть код с использованием wstring,wchar_t,wcin,wcout в котором открывается файл в кодировке Юникод но почему-то выводит абракадабру. ...

Юникод
На одной странице 2816 символов. Сколько КБ информации занимает память компьютера, если текст, создан в Unicode?


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru