Форум программистов, компьютерный форум, киберфорум
Microsoft Access
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
3 / 3 / 0
Регистрация: 16.10.2014
Сообщений: 144
1

Чувствую что это все таки кодировка

09.02.2017, 23:30. Показов 1267. Ответов 37
Метки нет (Все метки)

Доброго времени суток уважаемые форумчане!
Организовываю элементарный экспорт данных из Акса в текстовый файл. Иногда он проходит без проблем, а иногда текстовый файл наполнен иероглифами...
Интуитивно понимаю, что дело скорее всего в кодировке...
Может кто посоветует где какой тумблер нажать?..
СПС!
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.02.2017, 23:30
Ответы с готовыми решениями:

И все-таки кодировка! не пинайте больно
Да, я уже прочитал все, что тут и не только тут есть по кодировке, где то у меня затык. Очень...

Как же все-таки это реализовать?
Здравствуйте. Хотел бы поинтересоваться и попросить некоторой помощи в написании кода к задаче. Вот...

new - это операция или все таки оператор?
В большинстве интернет-источниках написано, (взять хоть википедию (да, я понимаю, что там много...

И что же все-таки лучше?
Сейчас у меня phpbb3, в целом все устраивает, но не нравится установка модулей, возникают иногда...

__________________
37
шапоклякистка 8-го дня
3657 / 2218 / 390
Регистрация: 26.06.2015
Сообщений: 4,647
Записей в блоге: 1
10.02.2017, 08:37 2
Цитата Сообщение от orange3100 Посмотреть сообщение
Организовываю элементарный экспорт данных из Акса в текстовый файл.
Как именно огранизовываете?

Или вы считаете, что споосб только один и потому уточнение не требуется? Так их много. Какой лично вам кажется "элементарным" - мы без понятия.

Кстати, версия акса у вас какая?

Цитата Сообщение от orange3100 Посмотреть сообщение
Иногда он проходит без проблем, а иногда текстовый файл наполнен ...
Если файл наполнен - экспорт определенно прошел без проблем.
1
3 / 3 / 0
Регистрация: 16.10.2014
Сообщений: 144
10.02.2017, 10:41  [ТС] 3
Цитата Сообщение от texnik-san Посмотреть сообщение
Как именно огранизовываете?
Прошу прощения за не грамотное оформление темы. Обычно всегда расписываю все подробно просто подумал, что данном случае этого не требуется...
Методика следующая:
Благодаря Eugene-LS, была написана функция записи текстовой переменной в файл TXT:
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
Public Function WriteTextInNewTxtFile(FlilePath As String, Text As String) As Boolean
 
'----Объявление Переменных
Dim fso As Object
Dim ts As Object
    '----Переход к обработчику ошибок
    On Error GoTo WriteTextInNewTxtFile_Error
 
'----Выполнение программы
Set fso = CreateObject("Scripting.FileSystemObject")
Set ts = fso.CreateTextFile(FlilePath, True, True)
ts.WriteLine Text
ts.Close
    '----Присвоение значения функции
    WriteTextInNewTxtFile = True
 
'----Выход из программы
WriteTextInNewTxtFile_Exit:
    On Error Resume Next
    '----Очищение переменных
    Set ts = Nothing
    Set fso = Nothing
    Exit Function
 
'----Обработчик Ошибок
WriteTextInNewTxtFile_Error:
    '----Вывод сообщения об ошибке
    MsgBox "Ошибка " & Err.Number & vbCrLf & Err.Description & vbCrLf & "в процедуре: ...", vbCritical, "Error!"
    '----Переход к выходу из программы
    Resume WriteTextInNewTxtFile_Exit
 
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
Sub ExportQueriesInTextFile()
 
Dim rst As DAO.Recordset
Dim sDataSet As String
Dim FilePath As String
Dim fso As Object
Dim ts As Object
 
Set rst = Application.CurrentDb.OpenRecordset("qryQueries", dbOpenSnapshot) 'Только просмотр
    Do Until rst.EOF = True 'Цикл до конца таблицы
        With rst.Fields
            sDataSet = sDataSet & !DataSetQuery & vbCrLf & vbCrLf & vbCrLf
        End With
        rst.MoveNext
        'Debug.Print sDataSet
    Loop
Debug.Print sDataSet
    
    
    
WriteTextInNewTxtFile "C:\Users\VG\DataBaseVG\New\prjAcElements\Queries\Queries.txt", sDataSet
 
 
ExportSourceCodesInTextFile_Bye:
    On Error Resume Next
    rst.Close
    'rstSub.Close
    Set rst = Nothing
    'Set rstSub = Nothing
    Exit Sub
 
ExportSourceCodesInTextFile_Err:
    MsgBox "Ошибка " & Err.Number & vbCrLf & Err.Description & vbCrLf & "в процедуре: бла бла", vbCritical, "Error in module Form_фрмГорода"
    Resume ExportSourceCodesInTextFile_Bye
 
    
End Sub
Версия Акса 13
1
Заблокирован
10.02.2017, 13:36 4
Цитата Сообщение от orange3100 Посмотреть сообщение
была написана функция записи текстовой переменной в файл TXT
Попробуйте исправить функцию экспорта так:
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
Public Function WriteTextInNewTxtFile(sFilePath As String, sText As String) As Boolean
 
'----Объявление Переменных
Dim fso As Object
Dim ts As Object
    '----Переход к обработчику ошибок
    On Error GoTo WriteTextInNewTxtFile_Error
 
'----Выполнение программы
 
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set ts = fso.CreateTextFile(sFilePath, True)
    ts.Write sText
    ts.Close
    
    '----Присвоение значения функции
    WriteTextInNewTxtFile = True
 
'----Выход из программы
WriteTextInNewTxtFile_Exit:
    '----Очищение переменных
    On Error Resume Next
    Set ts = Nothing: Set fso = Nothing
    Exit Function
    Exit Function
 
'----Обработчик Ошибок
WriteTextInNewTxtFile_Error:
    '----Вывод сообщения об ошибке
    MsgBox "Ошибка " & Err.Number & vbCrLf & Err.Description & vbCrLf & "в процедуре: ...", vbCritical, "Error!"
    '----Переход к выходу из программы
    Resume WriteTextInNewTxtFile_Exit
 
End Function
Тестовый код:
Visual Basic
1
2
3
4
    str = "01 Проверка - строка 01" & vbCrLf & "02 Проверка - строка 02"
    path = "D:\temp\test.txt"
    
    WriteTextInNewTxtFile path, str
- Выбросил текстовик в WIN-1251 (как положено), а до этого было действительно UTF-16LE

Добавлено через 2 минуты
и в процедуре переменные:
Visual Basic
1
2
Dim fso As Object
Dim ts As Object
Лишние - можно смело убрать.
2
3 / 3 / 0
Регистрация: 16.10.2014
Сообщений: 144
10.02.2017, 13:47  [ТС] 5
Eugene а как именно Вы выбросили его в win1251
0
Заблокирован
10.02.2017, 14:02 6
Цитата Сообщение от orange3100 Посмотреть сообщение
а как именно Вы выбросили его в win1251
Как и писал выше:
Visual Basic
1
2
3
4
5
6
7
Private Sub TestOne()
Dim str$, path$
    str = "01 Проверка - строка 01" & vbCrLf & "02 Проверка - строка 02"
    path = "D:\temp\test.txt"
    
    WriteTextInNewTxtFile path, str
End Sub
2
3 / 3 / 0
Регистрация: 16.10.2014
Сообщений: 144
10.02.2017, 14:14  [ТС] 7
Eugene я заметил изменения в функции только в моей 12-ой вашей 13-ой строке, а именно:
Wrileline--->Write, а что Вы исправили чтобы изменить кодировку с utf на win все равно чтото не понял. Объясните пож-та еще раз..
0
Заблокирован
10.02.2017, 14:28 8
Главное изменение в объявлении.
Вместо:
Visual Basic
1
Public Function WriteTextInNewTxtFile(FlilePath As String, Text As String) As Boolean
Пишем:
Visual Basic
1
Public Function WriteTextInNewTxtFile(sFilePath As String, sText As String) As Boolean
и дальше соответственно по названиям аргументов.
Название переменной Text (Text As String) - VBA сильно не понравилось ...
Text - одно из зарезервированных слов VBA

Точнее это "Не зарезервированное ключевое слово" - не желательно употреблять в коде.
См. Ключевые слова языка Visual Basic - внизу
2
шапоклякистка 8-го дня
3657 / 2218 / 390
Регистрация: 26.06.2015
Сообщений: 4,647
Записей в блоге: 1
10.02.2017, 20:19 9
Спасибо, orange3100 и Eugene-LS, я как раз такого метода вывода в текстовый файл и не знала раньше. Делала либо встроенными средствами экспорта, либо потсрочно Print #1
0
Эксперт MS Access
26631 / 14325 / 3171
Регистрация: 28.04.2012
Сообщений: 15,706
10.02.2017, 20:26 10
orange3100, у метода CreateTextFile есть третий параметр <Unicode>. Если он True, файл в юникоде, если False , то в ASCII. По умолчанию стоит False. Попробуйте поставить True:
Visual Basic
1
Set ts = fso.CreateTextFile(sFilePath, True, True)
2
Заблокирован
10.02.2017, 20:39 11
Лучший ответ Сообщение было отмечено orange3100 как решение

Решение

Цитата Сообщение от mobile Посмотреть сообщение
у метода CreateTextFile есть третий параметр <Unicode>
А можно вообще расширить ...
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
Function SaveTextToFile(ByVal txt$, ByVal filename$, Optional ByVal encoding$ = "windows-1251") As Boolean
' функция сохраняет текст txt в кодировке Charset$ в файл filename$
' [url]http://excelvba.ru/code/SaveTextToFile[/url]
' [url]http://excelvba.ru/code/encode[/url]
'-----------------------------------------------------------------
Dim FSO As Object
Dim ts As Object
Dim binaryStream As Object
 
On Error Resume Next: Err.Clear
    Select Case encoding$
 
        Case "windows-1251", "", "ansi"
            Set FSO = CreateObject("scripting.filesystemobject")
            Set ts = FSO.CreateTextFile(filename, True)
            ts.Write txt: ts.Close
            Set ts = Nothing: Set FSO = Nothing
 
        Case "utf-16", "utf-16LE"
            Set FSO = CreateObject("scripting.filesystemobject")
            Set ts = FSO.CreateTextFile(filename, True, True)
            ts.Write txt: ts.Close
            Set ts = Nothing: Set FSO = Nothing
 
        Case "utf-8noBOM"
            With CreateObject("ADODB.Stream")
                .Type = 2: .Charset = "utf-8": .Open
                .WriteText txt$
 
                Set binaryStream = CreateObject("ADODB.Stream")
                binaryStream.Type = 1: binaryStream.Mode = 3: binaryStream.Open
                .Position = 3: .CopyTo binaryStream        'Skip BOM bytes
                .flush: .Close
                binaryStream.SaveToFile filename$, 2
                binaryStream.Close
            End With
 
        Case Else
            With CreateObject("ADODB.Stream")
                .Type = 2: .Charset = encoding$: .Open
                .WriteText txt$
                .SaveToFile filename$, 2        ' сохраняем файл в заданной кодировке
                .Close
            End With
    End Select
    SaveTextToFile = Err = 0: DoEvents
End Function
2
3 / 3 / 0
Регистрация: 16.10.2014
Сообщений: 144
10.02.2017, 21:32  [ТС] 12
Ой ДРУЗЬЯ ТОВАРИЩИ...
чувствую что мозг закипит...
Для разных таблиц одна и та же функция VBA работает корректно и не корректно...
В чем может дело ну никак что-то не разберу.
Во вложении БД в которой два запроса:
1) qrySourceCodes (Экспортируется без проблем)
2) qryQueries (Экспортируется с Иероглифами)
3) qryQueriesTEST /где 1-а строка/ (Экспортируется с Иероглифами)

Почему одна и та же функция работает по разному с разными запросами???
0
Вложения
Тип файла: rar База.rar (98.7 Кб, 6 просмотров)
Модератор
Эксперт MS Access
10043 / 4057 / 654
Регистрация: 07.08.2010
Сообщений: 11,383
Записей в блоге: 3
10.02.2017, 21:37 13
Цитата Сообщение от orange3100 Посмотреть сообщение
qrySourceCodes (Экспортируется без проблем)
пока запросы не смотрела, но если только латиница и локализованная кириллица --проблем нет
0
Заблокирован
10.02.2017, 21:54 14
Цитата Сообщение от orange3100 Посмотреть сообщение
одна и та же функция VBA работает корректно и не корректно...
Visual Basic
1
Set ts = fso.CreateTextFile(strFlilePath, True, True)
Зачем? mobile, просто уточнил:
- "'Третий параметр <Unicode>. Если он True, файл в юникоде"
- но вам это не нужно - нужно 1251.
достаточно :
Visual Basic
1
Set ts = fso.CreateTextFile(sTXTPath, True, False)
Или просто:
Visual Basic
1
Set ts = fso.CreateTextFile(sTXTPath, True)
... должно быть 1251 (по уму)
1
Эксперт MS Access
26631 / 14325 / 3171
Регистрация: 28.04.2012
Сообщений: 15,706
10.02.2017, 21:59 15
Цитата Сообщение от orange3100 Посмотреть сообщение
Почему одна и та же функция работает по разному с разными запросами???
Да ясно почему. К сожалению вот так бывает с полями MEMO длиной более 255 символов. Достаточно общее решение уже показано Eugene-LS - надо применить ADODB.Stream с указанием кодировки 1251. Либо сокращать количество выводимых символов до 255
0
Заблокирован
10.02.2017, 22:09 16
Цитата Сообщение от mobile Посмотреть сообщение
К сожалению вот так бывает с полями MEMO длиной более 255 символов.
Точно бывает - уже поймал :
Visual Basic
1
Debug.Print sDataSet
- уже кракозябры выдаёт ... (до экспорта)
Вывот:
Нужно перекодировать ...

Добавлено через 2 минуты
Цитата Сообщение от orange3100 Посмотреть сообщение
В чем может дело ну никак что-то не разберу
Либо - в поле MEMO уже в неверной кодировке данные
Либо - тупо ГЛЮК!
0
3 / 3 / 0
Регистрация: 16.10.2014
Сообщений: 144
10.02.2017, 22:16  [ТС] 17
Цитата Сообщение от Eugene-LS Посмотреть сообщение
Нужно перекодировать ...
это как Вы предлагали "Расширить"?
0
7921 / 4970 / 548
Регистрация: 27.03.2013
Сообщений: 17,819
10.02.2017, 22:16 18
Цитата Сообщение от Eugene-LS Посмотреть сообщение
...Нужно перекодировать ...
Я всегда, первые два действа делаю так:
1. Сжать и восстановить БД.
если не помогло
2. Создаю Новую БД и ИМПОРТИРУЮ в неё всё из - Глюченной.
в 99% эти 2 действия помогають.
Иначе - Да,
Нужно или Репку усиленно чесать (пол сотням форумов лазить и аналогичные вопросы изыскивать или задавать) или заново УСЁ создавать.
2
Заблокирован
10.02.2017, 22:28 19
Цитата Сообщение от mobile Посмотреть сообщение
Да ясно почему. К сожалению вот так бывает с полями MEMO длиной более 255 символов.
Кстати - в первые замечаю такое!
А MEM-ками пользуюсь давно - и никаких траблов на выводе (экспорте в html = читай TXT) пока не видел (но в своих базах).

Добавлено через 2 минуты
Цитата Сообщение от orange3100 Посмотреть сообщение
это как Вы предлагали "Расширить"?
Ещё не понятно ...
Щас БД - в потроха гляну ....
Отвечу позднее (минуток через 10 -16)

Добавлено через 7 минут
Итак :
Поле: "DataSetQuery"
Запроса: "qryQueriesTEST"
(Первая запись)
Возвращает текст:
start of string --------------------------------
? ? ?? ? ? ?? ?
? ? ?
H? H? ш?H?ш? р?H?H?р?ш?@????? ъ????? ?? ?? Њ??? Ј? ???
? ?????????????????????
??? Њ? ? ? ?? ???? ? ??? ?? ? ??? ? ? ??? ? ? ?? ??

... и ещё много кракозябров ....
end --------------------------------

ВОТ И ВСЁ!
В смысле: Функция Экспорта в Текст - тут не при чём.
0
3 / 3 / 0
Регистрация: 16.10.2014
Сообщений: 144
10.02.2017, 22:30  [ТС] 20
Цитата Сообщение от Eugene-LS Посмотреть сообщение
... и ещё много кракозябров ....
end --------------------------------
ВОТ И ВСЁ!
и что это значит? делать тбл по новому и копировать данные в таблицу
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.02.2017, 22:30

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Что же все таки возвращает codePointAt?
Здравствуйте! Не могу понять, почему именно такое значение возвращает функция codePointAt. Знал...

Что же все-таки со скрытом разделом?
Здравствуйте форумчане. Решил обратиться к вам за помощью т.к. самостоятельно ничего не...

Что же все-таки такое ServerName?
Добрый день, уважаемые форумчане. В настоящее время пытаюсь разобраться в настройках Апача, в файле...

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


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

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

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