|
|
|
| Запуталася с кодировками.
Залача: Имеется dbf с данными в некоей досовской национальной кодировке. Требуется перекодировать её в Юникод. Собственно до перекодировки дело не дошло поскольку возникли проблеммы с распознованием исходного кода в VBA.
Мои действия:
Вариант1: работаю непосредственно с DBF(импорт или линковка без разницы). AscB(s) для символа с кодом 144(&H90) дает рез-т 32
Вариант2: С помощью Excel экспортирую в TXT. Код 144 распознает, но код 136(&H88) превращается в код 198
Какие исходные коды я смотрю в шестнадцатиричном редакторе в соответствующем файле.
Кто-нибудь может это объяснить? | |
|
| |
|
|
|
| http://hiprog.com/index.php?option=com_content&task=view&id=208
http://hiprog.com/index.php?option=com_content&task=view&id=100 | |
|
| |
|
|
|
|
| Да армянский, хотя это в данном случае не важно :-) Кстати не ARMSCII8 а какой то другой, похожий на ARMSCII8A(досовский альтернативный). А вскоре мне придётся вообще иметь дело с Калантаряновской кодировкой :-) | |
|
| |
|
|
|
|
| Нет так и не смог. Поменял в реестре для XBASE параметр DataCodePage c OEM на ANSI, но акс продолжает перекодировать по своему. Правда уже иначе чем раньше. Неужели нельзя заставить акс ничего не кодировать? Возможно на это влияют также настройки Regional Settings? Перешёл с русского на английский(Usa), но вроде ничего не поменялось, хотя возможно надо было перегрузить комп. Завтра ещё попробую | |
|
| |
|
|
|
| если access 2007 то ключик в реестре какой-то другой.
поищите ключики по слову xBase | |
|
| |
|
|
|
| ANSI - UNICODE + ARMENIAN = когда то я тоже мучился) | |
|
| |
|
|
|
| 2 lulukyan
Армянскии там водили через KDWIN ? (если да то плохи дела) | |
|
| |
|
|
|
|
| а раз так все запущено - можно попробовать написать не на VB свой декодер - который будет получать армянский код - на выходе давать удобоваримый и загонять в поле обратно.
поищи проги которые могут с этим бороться - типа открыть ДВФ и сохранить его еще как нибудь.
файл в студию | |
|
| |
|
|
|
|
|
|
| коды магу скинуть но прога в вб.нет написына и для меня | |
|
| |
|
|
|
| осталось в акс переделать и помочь человеку | |
|
| |
|
|
|
|
| П.С по мере работы с DBF узнал одну тонкость если из дбф-а експортировать в екзел то всё ок и ещё надо чтобы винда была англиская и без изминёных региональных настроек
я ставлю vertualbox + xp sp3 en у меня всегда всё ок и не имеет значения какой у вас язык русский , армянскый и т.д. | |
|
| |
|
|
|
| вот сам код
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
|
| |
|
| |
|
|
|
| 2 lulukyan если что магу в vba переделать | |
|
| |
|
2 Кб. |
|
| Спасибо всем ответившим. в VBA сам переделаю. Щас выхожу. Пока что высылаю dbf файл. | |
|
| |
|
|
|
| ок если что магу и анси2юникод конвертор дать | |
|
| |
|
|
|
| И че это вы такое выложили размером 2К?
А этот файл на вашем компе хоть какой-то прогой правильно читается?
Обычные текстовые файлы с текстом на армянском у вас читаются правильно?
BDE на вашем компе установлен? | |
|
| |
|
|
|
|
| Если BDE включен, то настройки реестра - пофиг. BDE заменяет стандартный драйвер своим.
И настраивать кодировку надо в администраторе BDE.
Еще можно попробовать читать файл с помощью ODBC Visual FoxPro драйвера. Он возвращает строки "как есть". | |
|
| |
|
|
|
| ODBC Visual FoxPro драйвер пробовал. Ведёт себя иначе но все равно коды искажает. А может до него их искажает BDE? Кста как мне вызвать Администратор BDE? | |
|
| |
|
1 Кб. |
|
| надо было запаковать. Высылаю заново.
Что касается того читается ли этот файл у меня. Дело в том, что кодировка у этого файла сильно устаревшая и у меня даже нет фонта для него. И это свовершенно не важно, поскольку задача стоит перекодировать его в Юникод а затем читать. Мне нужно всего лишь, чтобы акс давал мне текст как он есть, без искажения. То есть в редакторе я вижу код 144 и хочу чтобы AscB тоже давал 144.
Что касается BDE. Честно говоря не знаю, хотя это вполне возможно. Я где то читал, что он может установиться помимо твоей воли. Не знаю связано ли это с BDE, в реестре по ключику xbase параметр win32 равен C:\WINDOWS\system32\msxbde40.dll может это он и есть?
И ещё как вызвать администратор BDE? | |
|
| |
|
|
|
| 2 lulukyan если ексь майл агент пиши davka@inbox.ru | |
|
| |
|
|
|
| администратор 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
|
| |
|
| |
|
|
|
| Докладываю, чем кончилась моя эпопея с DBF файлами.
Не могу сказать, что дошёл до логического конца, но некоторая логическая точка достигнута. :-)
Обязан я этим статье Анатолия "Работаем с DBF файлами.doc".
Странно, но ни один из многочисленных методов подключения/импортирования таблиц не дал результата.
Зато в этой статье есть код функции ReadDBFtoRS возвращающий рекордсет, заполненный данными непосредственно из файла. Единственно я заменил стандартную функцию StrConv на свою собственную. Не хочу щас обсуждать чем меня не устроила StrConv. Может в будущем вернусь ещё к этому.
Кстати очень удобно. Достаточно поместить очередной дбф файл(коих ожидается много) в определенный каталог и нажать на кнопку на форме. | |
|
| |
|