Проблема с кодировкой в Access
Релиб
Форумы       Участники    Календарь    Кто он-лайн?
Добро пожаловать, гость ( Вход | Регистрация )
        



Проблема с кодировкой в Access Expand / Collapse
Автор
Сообщение
22.04.2007 22:41


Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

модератор
Last Login: 29.10.2007 14:45
Сообщ.: 1 833, Visits: 16 863
Приветствую, Уважаемые.

Возникла следующая проблема... Есть БД Access с некоторыми данными (которые заполнялись на удаленном сервере - виртуальном хостинге, находящемся в штатах - т.е. по всей видимости windows там английский) через веб интерфейс.

Теперь потребовалось перенести базу на другой сервер, однако что-то произошло с кодировкой. Символы как бы есть, но они нечитаемы. При копировании значения какой-либо ячейки в буфер и вставке в другом приложении они становятся читаемыми. Как это объяснить я толком понять не могу - такое ощущение, что как будто бы в моем Access не хватает шрифтов, но эта версия отклоняется, т.к. пробовали на многих машинах.

Таким образом - задача сводится к тому, чтобы преобразовтаь базу в нормальную кодировку Win-1251, которая будет без проблем читаема.

В аттаче скриншот - чтоб понятнее было и маленький кусочек из базы - для эксперементов.

Заранее спасибо.

  Post Attachments 
access.jpg (12 views, 52,62 KB)
db2.rar (11 views, 13,04 KB)

Сообщ. #912700
23.04.2007 12:25
новичок

новичокновичокновичокновичокновичокновичокновичокновичок

участник
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

Если кто знает более оптимальный способ поправить БД то мне это было бы тоже интересно.

Сообщ. #912711
23.04.2007 12:41


Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

модератор
Last Login: 29.10.2007 14:45
Сообщ.: 1 833, Visits: 16 863
Спасибо,  вечерком попробую. Главное, чтобы офсэт всегда был именно 848.

Как я понимаю, получилось что - то такое, что обычные символы стали восприниматься в юникод формате. Как это произошло - я понять не могу...

ПС: Если у кого-то есть еще какие-либо предложения по решению - пишите.

Сообщ. #912712
26.04.2007 14:43
новичок

новичокновичокновичокновичокновичокновичокновичокновичок

участник
Last Login: 26.04.2007 15:18
Сообщ.: 2, Visits: 6
To Alexey Spirin

Проблему решить удалось?

Сообщ. #912816
26.04.2007 14:59


Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

модератор
Last Login: 29.10.2007 14:45
Сообщ.: 1 833, Visits: 16 863
Да, благодаря Вашему наблюдению.

Ну и оберточку на ADOX сделал - на автомате по таблицам бегать и изменять стринговые поля.

Сообщ. #912817
« пред. тема | след. тема »


Эту тему читают Expand / Collapse
Посетители: 0 (0 гостей, 0 участников, 0 скрыт.участников)
Сейчас нет участников, просматривающих тему.
Модераторы: Alexey, boombastik, bazile, pl

Время GMT +3:00, Сейчас 5:30