Rambler's Top100
Форум: MS ACCESSVBVBA MS OfficeMS SQL server
Новые сообщения: 0000

Форум: MS ACCESS

Вопросы связанные с MS ACCESS

Обновить визитку
Участники «Online»
Все участники

 
 

Доброго времени суток, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Проблеммы с кодировками
 
 автор: lulukyan   (24.02.2012 в 23:32)   личное сообщение
 
 

Запуталася с кодировками.
Залача: Имеется dbf с данными в некоей досовской национальной кодировке. Требуется перекодировать её в Юникод. Собственно до перекодировки дело не дошло поскольку возникли проблеммы с распознованием исходного кода в VBA.

Мои действия:
Вариант1: работаю непосредственно с DBF(импорт или линковка без разницы). AscB(s) для символа с кодом 144(&H90) дает рез-т 32
Вариант2: С помощью Excel экспортирую в TXT. Код 144 распознает, но код 136(&H88) превращается в код 198

Какие исходные коды я смотрю в шестнадцатиричном редакторе в соответствующем файле.

Кто-нибудь может это объяснить?

  Ответить  
 
 автор: osmor   (25.02.2012 в 08:48)   личное сообщение
 
 

http://hiprog.com/index.php?option=com_content&task=view&id=208
http://hiprog.com/index.php?option=com_content&task=view&id=100

  Ответить  
 
 автор: ddi   (25.02.2012 в 13:30)   личное сообщение
 
 

Текст в DBF армянскый ?

  Ответить  
 
 автор: lulukyan   (26.02.2012 в 01:56)   личное сообщение
 
 

Да армянский, хотя это в данном случае не важно :-) Кстати не ARMSCII8 а какой то другой, похожий на ARMSCII8A(досовский альтернативный). А вскоре мне придётся вообще иметь дело с Калантаряновской кодировкой :-)

  Ответить  
 
 автор: ddi   (26.02.2012 в 13:07)   личное сообщение
 
 

Так ты решил проблему?

  Ответить  
 
 автор: lulukyan   (27.02.2012 в 03:50)   личное сообщение
 
 

Нет так и не смог. Поменял в реестре для XBASE параметр DataCodePage c OEM на ANSI, но акс продолжает перекодировать по своему. Правда уже иначе чем раньше. Неужели нельзя заставить акс ничего не кодировать? Возможно на это влияют также настройки Regional Settings? Перешёл с русского на английский(Usa), но вроде ничего не поменялось, хотя возможно надо было перегрузить комп. Завтра ещё попробую

  Ответить  
 
 автор: osmor   (27.02.2012 в 09:14)   личное сообщение
 
 

если access 2007 то ключик в реестре какой-то другой.
поищите ключики по слову xBase

  Ответить  
 
 автор: ddi   (27.02.2012 в 09:18)   личное сообщение
 
 

ANSI - UNICODE + ARMENIAN = когда то я тоже мучился)

  Ответить  
 
 автор: ddi   (27.02.2012 в 09:20)   личное сообщение
 
 

2 lulukyan
Армянскии там водили через KDWIN ? (если да то плохи дела)

  Ответить  
 
 автор: ddi   (27.02.2012 в 09:20)   личное сообщение
 
 

и ешё дбф в студию

  Ответить  
 
 автор: kot_k_k   (27.02.2012 в 10:21)   личное сообщение
 
 

а раз так все запущено - можно попробовать написать не на VB свой декодер - который будет получать армянский код - на выходе давать удобоваримый и загонять в поле обратно.

поищи проги которые могут с этим бороться - типа открыть ДВФ и сохранить его еще как нибудь.

файл в студию

  Ответить  
 
 автор: ddi   (27.02.2012 в 10:25)   личное сообщение
 
 

а я уже зделал )

  Ответить  
 
 автор: kot_k_k   (27.02.2012 в 10:33)   личное сообщение
 
 

ну-ну теперь посмотрим

  Ответить  
 
 автор: ddi   (27.02.2012 в 11:19)   личное сообщение
 
 

  Ответить  
 
 автор: ddi   (27.02.2012 в 11:19)   личное сообщение
 
 

коды магу скинуть но прога в вб.нет написына и для меня

  Ответить  
 
 автор: snipe   (27.02.2012 в 12:27)   личное сообщение
 
 

осталось в акс переделать и помочь человеку

  Ответить  
 
 автор: ddi   (27.02.2012 в 12:50)   личное сообщение
 
 

да

  Ответить  
 
 автор: ddi   (27.02.2012 в 12:59)   личное сообщение
 
 

П.С по мере работы с DBF узнал одну тонкость если из дбф-а експортировать в екзел то всё ок и ещё надо чтобы винда была англиская и без изминёных региональных настроек
я ставлю vertualbox + xp sp3 en у меня всегда всё ок и не имеет значения какой у вас язык русский , армянскый и т.д.

  Ответить  
 
 автор: ddi   (27.02.2012 в 13:09)   личное сообщение
 
 

вот сам код

 Public Sub dbf2access()
        Dim cn As New ADODB.Connection() ' это панятно
        Dim r As New ADODB.Recordset ' это понятно
        Dim dbf As New VisualFoxpro.FoxApplication ' сам Mr. фокс про
        Dim fd As New OpenFileDialog ' файл диалог
        Dim f As New Microsoft.Office.Interop.Access.Application 'аксс
        f.OpenCurrentDatabase(Application.StartupPath & "\db.accdb", False) ' открываю бд
        f.DoCmd.RunSQL("DELETE gdb1.* FROM gdb1;") 'удалаю таблу
        Dim lnk As String ' путь
        'Dim l As String
        With fd
            .Filter = "Visual Foxpro files (*.dbf)|*.dbf|All files (*.*)|*.*" ' критерия диалога
        End With
        For i As Integer = 1 To 6 'у меня 6 дбф-ов для каждова из них 
            Try
                fd.ShowDialog() ' выбераем 
                If fd.FileName = "" Then ' если нет
                    f.Application.Quit(Microsoft.Office.Interop.Access.AcQuitOption.acQuitSaveNone)
                    f = Nothing
                    dbf.Quit()
                    dbf = Nothing
                    Exit Sub
                Else ' если есть
                    lnk = fd.FileName
                    dbf.DoCmd("USE '" & lnk & "' SHARED") ' открываем
                    dbf.DoCmd("COPY TO " & Application.StartupPath & "\1.xls TYPE XL5") ' экспорт в екзел
                    f.DoCmd.TransferSpreadsheet(Microsoft.Office.Interop.Access.AcDataTransferType.acImport, , i, Application.StartupPath & "\1.xls", 1) 'импорт в бд
                    f.DoCmd.RunSQL("INSERT INTO gdb1 SELECT " & i & ".*FROM " & i & ";") ' дабавлаем в таблу
                    f.DoCmd.DeleteObject(Microsoft.Office.Interop.Access.AcObjectType.acTable, i) 'удалаем временую таблу
                    Kill(Application.StartupPath & "\1.xls") ' удалаем екзел
                End If
            Catch ' при ошибке
                f.Application.Quit(Microsoft.Office.Interop.Access.AcQuitOption.acQuitSaveNone)
                f = Nothing
                dbf.Quit()
                dbf = Nothing
                MsgBox("error")
                Exit Sub
            End Try
            fd.FileName = ""
        Next i
        cn.Open("con_str", "юзер", "пароль") 'потключаемся к SQL
        r = cn.Execute("DROP TABLE gdb1") 'удалаем таблу
        r = Nothing
        cn.Close()
        f.DoCmd.TransferDatabase(Microsoft.Office.Interop.Access.AcDataTransferType.acExport, "ODBC Database", _
                                 "ODBC;DSN=*;UID=****;PWD=*********;LANGUAGE=us_english;" _
            & "DATABASE=db", Microsoft.Office.Interop.Access.AcObjectType.acTable, "gdb1", "gdb1") ' експорт в SQL
        f.Application.Quit(Microsoft.Office.Interop.Access.AcQuitOption.acQuitSaveAll) ' выход
        f = Nothing
        dbf.Quit()
        dbf = Nothing
    End Sub

  Ответить  
 
 автор: ddi   (27.02.2012 в 13:11)   личное сообщение
 
 

2 lulukyan если что магу в vba переделать

  Ответить  
 
 автор: lulukyan   (27.02.2012 в 16:04)   личное сообщение
2 Кб.
 
 

Спасибо всем ответившим. в VBA сам переделаю. Щас выхожу. Пока что высылаю dbf файл.

  Ответить  
 
 автор: ddi   (27.02.2012 в 16:35)   личное сообщение
 
 

ок если что магу и анси2юникод конвертор дать

  Ответить  
 
 автор: Анатолий (Киев)   (28.02.2012 в 12:19)   личное сообщение
 
 

И че это вы такое выложили размером 2К?
А этот файл на вашем компе хоть какой-то прогой правильно читается?
Обычные текстовые файлы с текстом на армянском у вас читаются правильно?
BDE на вашем компе установлен?

  Ответить  
 
 автор: ddi   (28.02.2012 в 18:30)   личное сообщение
 
 

а зачем BDE?

  Ответить  
 
 автор: Анатолий (Киев)   (28.02.2012 в 19:21)   личное сообщение
 
 

Если BDE включен, то настройки реестра - пофиг. BDE заменяет стандартный драйвер своим.
И настраивать кодировку надо в администраторе BDE.

Еще можно попробовать читать файл с помощью ODBC Visual FoxPro драйвера. Он возвращает строки "как есть".

  Ответить  
 
 автор: lulukyan   (28.02.2012 в 22:30)   личное сообщение
 
 

ODBC Visual FoxPro драйвер пробовал. Ведёт себя иначе но все равно коды искажает. А может до него их искажает BDE? Кста как мне вызвать Администратор BDE?

  Ответить  
 
 автор: lulukyan   (28.02.2012 в 22:44)   личное сообщение
1 Кб.
 
 

надо было запаковать. Высылаю заново.

Что касается того читается ли этот файл у меня. Дело в том, что кодировка у этого файла сильно устаревшая и у меня даже нет фонта для него. И это свовершенно не важно, поскольку задача стоит перекодировать его в Юникод а затем читать. Мне нужно всего лишь, чтобы акс давал мне текст как он есть, без искажения. То есть в редакторе я вижу код 144 и хочу чтобы AscB тоже давал 144.

Что касается BDE. Честно говоря не знаю, хотя это вполне возможно. Я где то читал, что он может установиться помимо твоей воли. Не знаю связано ли это с BDE, в реестре по ключику xbase параметр win32 равен C:\WINDOWS\system32\msxbde40.dll может это он и есть?

И ещё как вызвать администратор BDE?

  Ответить  
 
 автор: ddi   (29.02.2012 в 11:37)   личное сообщение
 
 

2 lulukyan если ексь майл агент пиши davka@inbox.ru

  Ответить  
 
 автор: Анатолий (Киев)   (29.02.2012 в 14:49)   личное сообщение
 
 

администратор BDE (если он есть) можно откріть через Панель управления - Администрирование. Но, ИМХО, он вам не нужен.
Если ваш DBF открыть в HEX-редакторе, то в байте со смещением 29 (30-й по счету) увидите 01 - это кодовая страница CP437 (U.S. MS-DOS). Если указать C9 (CP1251) или 00 (системная CP, обычно та же 1251), то через ODBC VFP драйвер таблица откроется с "неиспорченой" кодировкой.


То есть в редакторе я вижу код 144 и хочу чтобы AscB тоже давал 144


А с чего вы взяли, что так должно быть? Для символов с кодом выше 127 Asc(), AscB() и AscW() будут совпадать только для CP437. Например (в окне отладки):
?Asc("S")
83
?AscB("S")
83
?AscW("S")
83

?Asc("Б")
193
?AscB("Б")
17
?AscW("Б")
1041
?Chr(193)
Б
?ChrW(1024+17)
Б

Access сам преобразует ANSI в Unicode, используя системную кодовую страницу. Если вас єто не устраивает, но обратное преобразование можно выполнить функцией StrConv("Текст", vbFromUnicode), а затем преобразоват по своему.

Ниже пример процедуры, выдающей в окне отладки ANSI коды и ANSI символы из 1-го поля 1-й строки файла. Там, кстати и код 144 есть.

Sub TestArmDBF()
Dim s$, bytArr() As Byte, i&
s = CurrentDb.OpenRecordset("mvds_4202").Fields(0)
Debug.Print s
bytArr = StrConv(s, vbFromUnicode)

For i = LBound(bytArr) To UBound(bytArr)
Debug.Print i; Tab; bytArr(i); Tab; Chr(bytArr(i))
Next
End Sub

  Ответить  
 
 автор: lulukyan   (27.03.2012 в 21:09)   личное сообщение
 
 

Докладываю, чем кончилась моя эпопея с DBF файлами.
Не могу сказать, что дошёл до логического конца, но некоторая логическая точка достигнута. :-)
Обязан я этим статье Анатолия "Работаем с DBF файлами.doc".
Странно, но ни один из многочисленных методов подключения/импортирования таблиц не дал результата.
Зато в этой статье есть код функции ReadDBFtoRS возвращающий рекордсет, заполненный данными непосредственно из файла. Единственно я заменил стандартную функцию StrConv на свою собственную. Не хочу щас обсуждать чем меня не устроила StrConv. Может в будущем вернусь ещё к этому.
Кстати очень удобно. Достаточно поместить очередной дбф файл(коих ожидается много) в определенный каталог и нажать на кнопку на форме.

  Ответить  
 
 автор: Анатолий (Киев)   (28.03.2012 в 13:24)   личное сообщение
 
 

  Ответить  
HiProg.com - Технологии программирования
Rambler's Top100 TopList