Форум программистов, компьютерный форум, киберфорум
Наши страницы
VBA
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.56/18: Рейтинг темы: голосов - 18, средняя оценка - 4.56
pragulin
1 / 1 / 0
Регистрация: 08.10.2016
Сообщений: 32
1

Преобразование кодировки cp1251 в UTF-8

08.10.2016, 23:24. Просмотров 3309. Ответов 10

Здравствуйте форумчане.

Есть большой файл excel, все буквы в крякозябрах.

Проверил онлайн декодером показал, что надо сделать преобразование кодировки из cp1251 в UTF-8.
Подскажите макрос под Excel для преобразование кодировки из cp1251 в UTF-8.
В программировани макросов, я чайник.

Заранее спасибо, за помощь.
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.10.2016, 23:24
Ответы с готовыми решениями:

Смена кодировки Windows 1251 на utf 8 без bom
Добрый день. Помогите в решении вопроса. Есть код: Private Sub Create_VCF() Dim FileNum As...

Кодировки cp1251 и UTf-8 отображение
Здравствуйте,уважаемые форумчане. Хотелось бы обратиться за помощью. Проблема такая. Есть сайт,...

Преобразование кодировки Unicode в UTF-8
Столкнулся просто с дичайшей проблемой: private void button1_Click(object sender, EventArgs e) ...

Определение кодировки в строке и преобразование ее в UTF-8
С помощью этого куска кода я получаю html страницы и записываю как обычную строку в response....

Разные кодировки файлов (ASCII, UTF-8, UTF-16)
Привет всем! Нужно написать программу поиска файлов, содержащих заданную строку. Т.е....

10
godmode
43 / 43 / 7
Регистрация: 26.12.2014
Сообщений: 189
09.10.2016, 04:55 2
Примерно так:

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
Public Sub Main()
 
For u = 1 To 200
 
For v = 1 To 200
 
If (Me.Cells(u, v)) <> "" Then
 
Dim base_cell As String
 
base_cell = Me.Cells(u, v)
 
Dim new_cell As String
 
new_cell = ""
 
For i = 1 To Len(base_cell)
 
Dim b As Integer
 
b = Asc(Mid(base_cell, i, 1))
 
If (b <= 127) Then
 
new_cell = new_cell & ChrW(b)
 
ElseIf (b >= 192) Then
 
new_cell = new_cell & ChrW( 4 * 255 + b - 176)
 
ElseIf (b = 184) Then
 
new_cell = new_cell & ChrW(1105)
 
ElseIf (b = 168) Then
 
new_cell = new_cell & ChrW(1025)
 
Else
 
new_cell = new_cell & ChrW(b)
 
End If
 
Next
 
Me.Cells(u, v) = new_cell
 
End If
 
Next
Next
 
End Sub
Под рукой нет ексела, чтоб проверить.
0
dimsaratov
353 / 292 / 78
Регистрация: 02.10.2013
Сообщений: 476
Записей в блоге: 5
09.10.2016, 19:10 3
vb.net
1
2
3
4
Dim srcEncoding as Encoding=System.Text.Encoding.GetEncoding(1251)
Dim dstEncoding as Encoding=System.Text.Encoding.GetEncoding(65001)
Dim Bytes() as Byte ' Текст как массив байт
System.Text.Convert(srcEncoding, dstEncoding,bytes)
https://msdn.microsoft.com/ru-ru/library/kdcak6ye(v=vs.110).aspx
0
godmode
43 / 43 / 7
Регистрация: 26.12.2014
Сообщений: 189
09.10.2016, 19:41 4
Цитата Сообщение от dimsaratov Посмотреть сообщение
vb.net
Выделить код
1
2
3
4
Dim srcEncoding as Encoding=System.Text.Encoding.GetEncoding(1251)
Dim dstEncoding as Encoding=System.Text.Encoding.GetEncoding(65001)
Dim Bytes() as Byte ' Текст как массив байт
System.Text.Convert(srcEncoding, dstEncoding,bytes)
https://msdn.microsoft.com/ru-ru/lib...v=vs.110).aspx
Ну и причем здесть vbnet?
0
09.10.2016, 19:41
pragulin
1 / 1 / 0
Регистрация: 08.10.2016
Сообщений: 32
09.10.2016, 22:39  [ТС] 5
Цитата Сообщение от godmode Посмотреть сообщение
Примерно так:
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
Public Sub Main()
For u = 1 To 200
For v = 1 To 200
If (Me.Cells(u, v)) <> "" Then
Dim base_cell As String
base_cell = Me.Cells(u, v)
Dim new_cell As String
new_cell = ""
For i = 1 To Len(base_cell)
Dim b As Integer
b = Asc(Mid(base_cell, i, 1))
If (b <= 127) Then
new_cell = new_cell & ChrW(b)
ElseIf (b >= 192) Then
new_cell = new_cell & ChrW( 4 * 255 + b - 176)
ElseIf (b = 184) Then
new_cell = new_cell & ChrW(1105)
ElseIf (b = 168) Then
new_cell = new_cell & ChrW(1025)
Else
new_cell = new_cell & ChrW(b)
End If
Next
Me.Cells(u, v) = new_cell
End If
Next
Next
End Sub
Создал макрос вставил код, который выше.
Запустил макрос выдало ошибку:

Compile error: Invalid use of Me keyword.
Подсветка строки 7.
0
Hugo121
6501 / 2550 / 458
Регистрация: 19.10.2012
Сообщений: 7,660
09.10.2016, 22:52 6
Не туда вставили... В лист нужно, раз Me. Сам код не анализировал.
0
pragulin
1 / 1 / 0
Регистрация: 08.10.2016
Сообщений: 32
09.10.2016, 23:07  [ТС] 7
Спасибо за подсказку.
Вставил в лист, код заработал.
НО...
Вместо крякозябр, появились русские буквы разделенные дробными числами, символами плюс, минус,процентами и т.д.
0
godmode
43 / 43 / 7
Регистрация: 26.12.2014
Сообщений: 189
09.10.2016, 23:25 8
Цитата Сообщение от pragulin Посмотреть сообщение
Спасибо за подсказку.
Вставил в лист, код заработал.
НО...
Вместо крякозябр, появились русские буквы разделенные дробными числами, символами плюс, минус,процентами и т.д.
Такс. Эксел поставлен. Скинь базовый документ, так проще будет понять в чем дело.
0
pragulin
1 / 1 / 0
Регистрация: 08.10.2016
Сообщений: 32
10.10.2016, 14:28  [ТС] 9
Всем спасибо за ответы.

Небольшое уточнение файл был primer.csv.

Я записал Macros импорта данных в Excel и конвертацию данных.
Сразу все сработало.


Может кому-то пригодится:

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
Sub Convert()
'
' Convert Макрос
'
 
'
        With ActiveSheet.QueryTables.Add(Connection:="TEXT;D:\Temp\primer.csv", _
        Destination:=Range("$A$1"))
        .Name = "primer"
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .TextFilePromptOnRefresh = False
        .TextFilePlatform = 65001
        .TextFileStartRow = 1
        .TextFileParseType = xlDelimited
        .TextFileTextQualifier = xlTextQualifierNone
        .TextFileConsecutiveDelimiter = False
        .TextFileTabDelimiter = False
        .TextFileSemicolonDelimiter = False
        .TextFileCommaDelimiter = False
        .TextFileSpaceDelimiter = False
        .TextFileOtherDelimiter = """"
        .TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
        .TextFileTrailingMinusNumbers = True
        .Refresh BackgroundQuery:=False
    End With
    ActiveWindow.SmallScroll Down:=-30
End Sub
0
KoGG
5328 / 1394 / 330
Регистрация: 23.12.2010
Сообщений: 2,071
Записей в блоге: 1
10.10.2016, 16:25 10
Цитата Сообщение от pragulin Посмотреть сообщение
Может кому-то пригодится
Кому надо - не повторяйте, делайте проще:
Visual Basic
1
2
3
4
5
    Workbooks.OpenText FileName:="D:\Temp\primer.csv", Origin:=65001, _
        StartRow:=1, DataType:=xlDelimited, TextQualifier:= xlTextQualifierNone, _
        Other:=True, OtherChar:="""", _
        FieldInfo:=Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), _
        TrailingMinusNumbers:=True
0
godmode
43 / 43 / 7
Регистрация: 26.12.2014
Сообщений: 189
18.10.2016, 12:22 11
Ну а самый простой вариант это кода вообще ничего не делается. С таким подходом вы кода-нибудь обнаружите, что не умеете решать проблемы самостоятельно.
0
18.10.2016, 12:22
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.10.2016, 12:22

Русский CP1251 в UTF-8
Нужна фичя для замены русских букв в UTF-8 т.е. я пишу на русском получается адракадабра (символы...

Нужно перевести из cp1251 в utf-8.
Всем привет. Я парсю html с левого сайта и получаю вместо русского текста кракозяблики, вот...

Преобразовать utf-8 в cp1251 и обратно
Преобразовать надо без использования сторонних библиотек(windows.h тоже сторонняя библиотека)....


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.