|
|
|
Supreme Being
      
модератор
Last Login: 29.10.2007 14:45
Сообщ.: 1 833,
Visits: 16 863
|
|
| Приветствую, Уважаемые. Возникла следующая проблема... Есть БД Access с некоторыми данными (которые заполнялись на удаленном сервере - виртуальном хостинге, находящемся в штатах - т.е. по всей видимости windows там английский) через веб интерфейс. Теперь потребовалось перенести базу на другой сервер, однако что-то произошло с кодировкой. Символы как бы есть, но они нечитаемы. При копировании значения какой-либо ячейки в буфер и вставке в другом приложении они становятся читаемыми. Как это объяснить я толком понять не могу - такое ощущение, что как будто бы в моем Access не хватает шрифтов, но эта версия отклоняется, т.к. пробовали на многих машинах. Таким образом - задача сводится к тому, чтобы преобразовтаь базу в нормальную кодировку Win-1251, которая будет без проблем читаема. В аттаче скриншот - чтоб понятнее было и маленький кусочек из базы - для эксперементов. Заранее спасибо.
|
|
|
|
|
новичок
      
участник
Last Login: 26.04.2007 15:18
Сообщ.: 2,
Visits: 6
|
|
Путем научного тыка было установленно, что коды дополнительных символов (>127) смещенны на 848. Почему это произошло не знаю, но вот такой код запущенный в VB правит тестовую БД:Private cnn As ADODB.Connection Private cmm As ADODB.Command
Private Sub Form_Load() Set cnn = New ADODB.Connection With cnn .ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\DOC\db2.mdb;Persist Security Info=False" .Open End With End Sub
Private Function ConvertSTR(stIN$) As String Const Offset = 848 Dim i%, l%, stOUT$, stX$ l = Len(stIN) For i = 1 To l stX = Mid$(stIN, i, 1) If (AscW(stX) > 127) Then stOUT = stOUT & ChrW$((AscW(stX) + Offset)) Else stOUT = stOUT & stX End If Next i ConvertSTR = stOUT End Function Private Sub Command2_Click() Dim rst As ADODB.Recordset, stIN$, stX$, i&, stIN1$, stOUT$ Set rst = New ADODB.Recordset With rst Call .Open("tblNews", cnn, adOpenDynamic, adLockOptimistic) Do While .EOF <> True If (Not IsNull(.Fields("Body"))) Then .Fields("Body") = ConvertSTR(.Fields("Body")) Call .Update End If .MoveNext Loop End With End Sub
Если кто знает более оптимальный способ поправить БД то мне это было бы тоже интересно.
|
|
|
|
|
Supreme Being
      
модератор
Last Login: 29.10.2007 14:45
Сообщ.: 1 833,
Visits: 16 863
|
|
| Спасибо, вечерком попробую. Главное, чтобы офсэт всегда был именно 848. Как я понимаю, получилось что - то такое, что обычные символы стали восприниматься в юникод формате. Как это произошло - я понять не могу... ПС: Если у кого-то есть еще какие-либо предложения по решению - пишите.
|
|
|
|
|
новичок
      
участник
Last Login: 26.04.2007 15:18
Сообщ.: 2,
Visits: 6
|
|
|
|
|
|
Supreme Being
      
модератор
Last Login: 29.10.2007 14:45
Сообщ.: 1 833,
Visits: 16 863
|
|
| Да, благодаря Вашему наблюдению. Ну и оберточку на ADOX сделал - на автомате по таблицам бегать и изменять стринговые поля.
|
|
|
|