Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
-18 / 3 / 0
Регистрация: 12.01.2014
Сообщений: 210

Как декодировать русский текст из UTF-8 в читаемый

05.09.2020, 20:01. Показов 2629. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вот слово привет привет
нужно его уметь считывать в привет и обратно
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.09.2020, 20:01
Ответы с готовыми решениями:

Кодировка utf-8, как декодировать обратно в русский текст?
Проблема такая - с бека на запрос ext.direct приходит ответ, если он без exeptions, то все ок грид запоняется - буквы из utf-8...

Читаемый текст в WebView UTF-8 вместо символов
Добрый вечер всем, подскажите, я конечно глупый вопрос задаю, сам имею сайт, и как бы разбираюсь в кодировке, но всеже чтобы не...

UTF-8 без BOM. Как вернуть русский текст?
Всем добрый день. преобразовал страницу в utf-8 без BOM. И в php дизайнере в настройках указал сохранять в UTF-8 без BOM. Вместо русского...

3
1104 / 480 / 33
Регистрация: 05.07.2018
Сообщений: 1,870
Записей в блоге: 7
05.09.2020, 20:50
Уважаемый Rad0n,
мне правда не приходилось решать подобную задачу. Но полагаю, что тут ничего особенного нет.
Итак, слово "привет" состоит из шести букв. Вам надо обработать 12 символов. Можно предположить, что главными (определяющими) символами являются те, что стоят на чётных местах. В общем чтобы не гадать попробуйте используя функцию ASC() перевести все символы в их числовые значения (всего 12 чисел). Тогда будет видно в каком соотношении они находятся с буквами русского алфавита.

примечание
если бы мне пришлось решать подобную задачу, то я взял бы следующее "слово" абвгдежзийклмнопрстуфхцчшщъыьэюя
1
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38171 / 21106 / 4307
Регистрация: 12.02.2012
Сообщений: 34,699
Записей в блоге: 14
06.09.2020, 09:30
На просторах Интернета (автор Comanchе):

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
Public Enum CHARSET
  CS_DOS = 866
  CS_Windows = 1251
  CS_ISO = 28595
  CS_KOI8R = 20866
  CS_UTF7 = 65000
  CS_UTF8 = 65001
End Enum
 
Public Function ConvertFromUTF8(InBuf As String) As String
  ConvertFromUTF8 = ConvertCharset(InBuf, CS_UTF8, CS_Windows)
End Function
 
Public Function ConvertCharset(ByVal strString As String, ByVal FromCharset As CHARSET, ByVal ToCharset As CHARSET) As String
  Dim lngLength As Long
  Dim strWideChar As String
  Dim strReturn As String
  Dim lngReturnLength As Long
  Dim dwFlags As Long
  
  If FromCharset = CS_UTF7 Or FromCharset = CS_UTF8 Then
    dwFlags = 0
  Else
    dwFlags = MB_PRECOMPOSED
  End If
  
  lngLength = Len(strString)
  strWideChar = String$(lngLength * 2, Chr$(0))
  strReturn = String$(lngLength * 2, Chr$(0))
  lngReturnLength = MultiByteToWideChar(FromCharset, dwFlags, strString, lngLength, strWideChar, lngLength)
  WideCharToMultiByte ToCharset, 0, strWideChar, lngReturnLength, strReturn, lngLength * 2, ByVal 0, 0
  ConvertCharset = Left$(strReturn, lngReturnLength)
End Function
3
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
06.09.2020, 18:01
Лучший ответ Сообщение было отмечено Catstail как решение

Решение

Я как-то делал класс который позволяет распознавать кодировку и сохранять в нескольких кодировках текстовый файл:
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
Option Explicit
 
Public Enum eTextEncoding
    TE_ANSI = 0
    TE_UNICODE = 1
    TE_UTF8 = 2
    TE_CPMASK = 3
    TE_BIGENDIAN = 4
    TE_HASBOM = 8
End Enum
 
Private m_sContent  As String
Private m_eEncoding As eTextEncoding
Private m_sFileName As String
 
Public Property Get Encoding() As eTextEncoding
    Encoding = m_eEncoding
End Property
Public Property Let Encoding( _
                    ByVal eValue As eTextEncoding)
    m_eEncoding = eValue
End Property
 
Public Property Get Content() As String
    Content = m_sContent
End Property
Public Property Let Content( _
                    ByRef sValue As String)
    m_sContent = sValue
End Property
 
Public Property Get FileName() As String
    FileName = m_sFileName
End Property
Public Property Let FileName( _
                    ByRef sValue As String)
    m_sFileName = sValue
End Property
 
Public Function SaveTextFile( _
                ByRef sFileName As String) As Boolean
    Dim bData()     As Byte
    Dim hFile       As OLE_HANDLE
    Dim lSize       As Long
    Dim lIndex      As Long
    Dim lSymIdx     As Long
    Dim pString     As Long
    Dim lChar       As Long
    Dim lTotalSize  As Long
    Dim lCodePage   As Long
    
    On Error GoTo CleanUp
    
    hFile = CreateFile(sFileName, GENERIC_WRITE Or GENERIC_READ, 0, ByVal 0&, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0)
    If hFile = INVALID_HANDLE_VALUE Then
        Err.Raise 7, "CTextFile::SaveTextFile", "CreateFile failed"
    End If
    
    Select Case (m_eEncoding And TE_CPMASK)
    Case TE_ANSI, TE_UTF8
        
        If (m_eEncoding And TE_CPMASK) = TE_ANSI Then
            lCodePage = CP_ACP
        Else
        
            lCodePage = CP_UTF8
                
            If m_eEncoding And TE_HASBOM Then
                lTotalSize = 3: lIndex = 3
            End If
        
        End If
 
        If Len(m_sContent) Then
        
            lSize = WideCharToMultiByte(lCodePage, 0, ByVal StrPtr(m_sContent), Len(m_sContent), ByVal 0&, 0, ByVal 0&, 0)
            If lSize = 0 Then
                Err.Raise 7, "CTextFile::SaveTextFile", "WideCharToMultiByte failed"
            End If
            
            lTotalSize = lTotalSize + lSize
            
            ReDim bData(lTotalSize - 1)
            
            If WideCharToMultiByte(lCodePage, 0, ByVal StrPtr(m_sContent), Len(m_sContent), bData(lIndex), lSize, ByVal 0&, 0) = 0 Then
                Err.Raise 7, "CTextFile::SaveTextFile", "WideCharToMultiByte failed"
            End If
 
        End If
        
        If (m_eEncoding And TE_HASBOM) And ((m_eEncoding And TE_CPMASK) = TE_UTF8) Then
            bData(0) = &HEF
            bData(1) = &HBB
            bData(2) = &HBF
        End If
 
    Case TE_UNICODE
        
        lSize = LenB(m_sContent)
    
        If m_eEncoding And TE_HASBOM Then
            lTotalSize = lSize + 2
        Else
            lTotalSize = lSize
        End If
        
        If lTotalSize > 0 Then
        
            ReDim bData(lTotalSize - 1)
            
            If m_eEncoding And TE_HASBOM Then
                If m_eEncoding And TE_BIGENDIAN Then
                    GetMem2 &HFFFE&, bData(0)
                Else
                    GetMem2 &HFEFF&, bData(0)
                End If
                
                lIndex = lIndex + 2
                
            End If
            
            If m_eEncoding And TE_BIGENDIAN Then
                
                pString = StrPtr(m_sContent)
            
                For lSymIdx = 0 To Len(m_sContent) - 1
                    GetMem2 ByVal pString + lSymIdx * 2, lChar
                    lChar = (lChar \ &H100) Or ((lChar And &HFF) * &H100)
                    GetMem2 lChar, bData(lIndex + lSymIdx * 2)
                Next
                
            Else
                memcpy bData(lIndex), ByVal StrPtr(m_sContent), LenB(m_sContent)
            End If
            
        End If
        
    End Select
       
    If lTotalSize > 0 Then
    
        If WriteFile(hFile, bData(0), lTotalSize, lSize, ByVal 0&) = 0 Then
            Err.Raise 7, "CTextFile::SaveTextFile", "WriteFile failed"
        End If
        
        If lSize = lTotalSize Then
            SaveTextFile = True
        End If
        
    Else
        SaveTextFile = True
    End If
    
    m_sFileName = sFileName
    
CleanUp:
    
    CloseHandle hFile
    
    If Err.Number Then
        Err.Raise Err.Number, Err.Source, Err.Description, Err.HelpFile, Err.HelpContext
    End If
    
End Function
 
' //
' // Load file and convert it to UTF-16
' //
Public Sub LoadTextFile( _
           ByRef sFileName As String)
    Dim hFile   As OLE_HANDLE
    Dim hMap    As OLE_HANDLE
    Dim pData   As Long
    Dim liSize  As LARGE_INTEGER
    
    hFile = CreateFile(sFileName, GENERIC_READ, 0, ByVal 0&, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0)
    If hFile = INVALID_HANDLE_VALUE Then
        Err.Raise 7, "CTextFile::LoadTextFile", "CreateFile failed"
    End If
    
    If GetFileSizeEx(hFile, liSize) = 0 Then
        CloseHandle hFile
        Err.Raise 7, "CTextFile::LoadTextFile", "GetFileSizeEx failed"
    End If
    
    If liSize.HighPart <> 0 Or liSize.LowPart < 0 Or liSize.LowPart > 10000000 Then
        CloseHandle hFile
        Err.Raise 7, "CTextFile::LoadTextFile", "File is too big"
    End If
    
    hMap = CreateFileMapping(hFile, ByVal 0&, PAGE_READONLY, 0, 0, vbNullString)
    CloseHandle hFile
    If hMap = 0 Then
        Err.Raise 7, "CTextFile::LoadTextFile", "CreateFileMapping failed"
    End If
    
    pData = MapViewOfFile(hMap, FILE_MAP_READ, 0, 0, 0)
    CloseHandle hMap
    If pData = 0 Then
        Err.Raise 7, "CTextFile::LoadTextFile", "MapViewOfFile failed"
    End If
    
    On Error GoTo CleanUp
    
    LoadFromMemory pData, liSize.LowPart
    
    m_sFileName = sFileName
    
CleanUp:
    
    UnmapViewOfFile ByVal pData
       
    If Err.Number Then
        Err.Raise Err.Number, Err.Source, Err.Description, Err.HelpFile, Err.HelpContext
    End If
       
End Sub
 
Private Function LoadFromMemory( _
                 ByVal pData As Long, _
                 ByVal lSize As Long) As String
    Dim eEncoding   As eTextEncoding
    Dim sRet        As String
    Dim lRetSize    As Long
    Dim lIndex      As Long
    Dim lCodePage   As Long
    Dim lSwap       As Long
    Dim pRet        As Long
    
    If lSize = 0 Then Exit Function
    
    eEncoding = DetectEncoding(pData, lSize)
 
    If (eEncoding And TE_CPMASK) = TE_UNICODE Then
        
        If eEncoding And TE_HASBOM Then
            pData = pData + 2
            lSize = lSize - 2
        End If
        
        sRet = Space$((lSize + 1) \ 2)
        
        If eEncoding And TE_BIGENDIAN Then
            
            pRet = StrPtr(sRet)
            
            For lIndex = 0 To Len(sRet) - 1
                
                GetMem2 ByVal pData + lIndex * 2, lSwap
                lSwap = ((lSwap And &HFF) * &H100) Or (lSwap \ &H100)
                GetMem2 lSwap, ByVal pRet + lIndex * 2
                
            Next
            
        Else
            memcpy ByVal StrPtr(sRet), ByVal pData, lSize
        End If
        
    Else
        
        If (eEncoding And TE_CPMASK) = TE_ANSI Then
            lCodePage = CP_ACP
        ElseIf (eEncoding And TE_CPMASK) = TE_UTF8 Then
            
            lCodePage = CP_UTF8
            
            If eEncoding And TE_HASBOM Then
                pData = pData + 3
                lSize = lSize - 3
            End If
            
        End If
        
        lRetSize = MultiByteToWideChar(lCodePage, 0, ByVal pData, lSize, ByVal 0&, 0)
        If lRetSize = 0 Then
            Err.Raise 7, "CTextFile::LoadFromMemory", "MultiByteToWideChar failed"
        End If
        
        sRet = Space$(lRetSize)
        
        If MultiByteToWideChar(lCodePage, 0, ByVal pData, lSize, ByVal StrPtr(sRet), lRetSize) = 0 Then
            Err.Raise 7, "CTextFile::LoadFromMemory", "MultiByteToWideChar failed"
        End If
        
    End If
    
    m_sContent = sRet
    m_eEncoding = Encoding
    
End Function
 
Private Function DetectEncoding( _
                 ByVal pData As Long, _
                 ByVal lSize As Long) As eTextEncoding
    Dim lBOM    As Long
    Dim bBE     As Boolean
    
    If lSize < 2 Then
        DetectEncoding = TE_ANSI
        Exit Function
    End If
    
    GetMem2 ByVal pData, lBOM
    
    If lBOM = &HFEFF& Then
        ' // UTF-16 LE
        DetectEncoding = TE_UNICODE Or TE_HASBOM
    ElseIf lBOM = &HFFFE& Then
        ' // UTF-16 BE
        DetectEncoding = TE_UNICODE Or TE_BIGENDIAN Or TE_HASBOM
    ElseIf lSize > 2 Then
        If lBOM = &HBBEF& Then
            
            GetMem1 ByVal pData + 2, lBOM
            
            If (lBOM And &HFF) = &HBF Then
                ' // UTF-8
                DetectEncoding = TE_UTF8 Or TE_HASBOM
            End If
            
        Else
            If IsInputTextUnicode(pData, lSize, bBE) Then
                ' // UTF-16
                If bBE Then
                    DetectEncoding = TE_UNICODE Or TE_BIGENDIAN
                Else
                    DetectEncoding = TE_UNICODE
                End If
            ElseIf IsInputTextUTF8(pData, lSize) Then
                ' // UTF-8
                DetectEncoding = TE_UTF8
            Else
                ' // ANSI
                DetectEncoding = TE_ANSI
            End If
        End If
    Else
        DetectEncoding = TE_ANSI
    End If
                     
End Function
 
Private Function IsInputTextUTF8( _
                 ByVal pData As Long, _
                 ByVal lSize As Long) As Boolean
    Dim bChar   As Byte
    Dim lIndex  As Long
    Dim bNoHigh As Boolean
    Dim lCount  As Long
    
    If lSize <= 0 Then Exit Function
    
    bNoHigh = True
    
    For lIndex = 0 To lSize - 1
    
        GetMem1 ByVal pData + lIndex, bChar
        
        If (bChar And &H80) <> 0 Then
            bNoHigh = False
        End If
            
        If lCount Then
            
            If (bChar And &HC0) <> &H80 Then
                Exit Function
            End If
            
            lCount = lCount - 1
            
        ElseIf bChar >= &H80 Then
        
            Do
                
                bChar = (CLng(bChar) * 2) And &HFF
                lCount = lCount + 1
                
            Loop While bChar And &H80
            
            lCount = lCount - 1
            
            If lCount = 0 Then
                Exit Function
            End If
            
        End If
        
    Next
    
    If CBool(lCount) Or bNoHigh Then
        Exit Function
    Else
        IsInputTextUTF8 = True
    End If
    
End Function
 
Private Function IsInputTextUnicode( _
                 ByVal pData As Long, _
                 ByVal lSize As Long, _
                 ByRef bIsBigEndian As Boolean) As Boolean
    Dim lFlags  As Long
    
    lFlags = -1
    
    If IsTextUnicode(ByVal pData, lSize, lFlags) Then
        If lSize < 100 And lFlags = IS_TEXT_UNICODE_STATISTICS Then
            IsInputTextUnicode = False
        Else
        
            If lFlags = IS_TEXT_UNICODE_REVERSE_STATISTICS Then
                bIsBigEndian = True
            Else
                bIsBigEndian = False
            End If
            
            IsInputTextUnicode = True
            
        End If
    End If
    
End Function
https://github.com/thetrik/Vec... -Converter
5
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.09.2020, 18:01
Помогаю со студенческими работами здесь

Как заставить Powershell видеть русский текст в UTF-8 файле?
Есть текстовый файл в UTF-8, есть работающий скрипт для его разбора: $file=&quot;Z:\20190319_235153.txt&quot; $regex =...

UTF-8 и русский текст выводящийся на прямую
Всем привет, проблема в следующем. Нужно сделать многоязычный сайт, я решил для этого использовать кодировку UTF-8 и все бы хорошо, вроде...

Как декодировать ascii в utf?
Линуксовая прога на входе получает символы вида \u0424. Как их проще всего декодировать, чтобы потом вывести в читаемом виде?

Декодировать в utf-8
Добрый день! Помогите разобраться. Как декодировать строку в utf-8 import json data = u'''''' json_string =...

Flash, как привести текст в читаемый вид
ребята , подскажите как из даного текста &quot;%B0%D0%BD%D0%B8%D0%BB%&quot; получить нормальный текст


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru