Кодировка UTF-8 и MS-Access
Модератор: Модераторы
- EmeraldMan
- постоялец
- Сообщения: 149
- Зарегистрирован: 16.10.2008 08:41:51
- Откуда: Белгород
- Контактная информация:
Кодировка UTF-8 и MS-Access
Всем привет! Я тут первый раз, тоже вот увлекаюсь FreePascal и Lazarus.
Подскажите пожалуйста такой вопросик:
У меня есть БД на Access; с версией 0.9.24 я прекрасно работал через компонент ODBCConnection; Я почитал ваш форум и более менее разобрался с переводом из одной кодировки в другую, но! когда я записываю данные через свою программу, потом читаю, то они хорошо отображаются, а вот при просмотре в Access совсем никак (т.е. через него нельзя ни просматривать ни редактировать иначе Lazarus не воспримет). Как бы сделать так, чтобы я их мог и через программу нормально работать и через Access.
Есть конечно два пути: - настроить Access, чтобы работал с UTF-8
- настроить ODBCConnection (или ещё чего в Lazarus) чтобы работал с cp-1251.
Но ни то не другое, не нашел как настраивать...
Помогите пожалуйста!
Подскажите пожалуйста такой вопросик:
У меня есть БД на Access; с версией 0.9.24 я прекрасно работал через компонент ODBCConnection; Я почитал ваш форум и более менее разобрался с переводом из одной кодировки в другую, но! когда я записываю данные через свою программу, потом читаю, то они хорошо отображаются, а вот при просмотре в Access совсем никак (т.е. через него нельзя ни просматривать ни редактировать иначе Lazarus не воспримет). Как бы сделать так, чтобы я их мог и через программу нормально работать и через Access.
Есть конечно два пути: - настроить Access, чтобы работал с UTF-8
- настроить ODBCConnection (или ещё чего в Lazarus) чтобы работал с cp-1251.
Но ни то не другое, не нашел как настраивать...
Помогите пожалуйста!
- EmeraldMan
- постоялец
- Сообщения: 149
- Зарегистрирован: 16.10.2008 08:41:51
- Откуда: Белгород
- Контактная информация:
Attid писал(а):EmeraldMan писал(а):с версией 0.9.24
эта версия работает с 1251. или ты про линукс ?
Про Windows.
С версией 0.9.24 проблем не было, но хотелось бы переходить на более новые версии. И вот когда с помощью 0.9.26 записываешь данные в базу, то при просмотре потом в Access - абракадабра.
Повторюсь:
Можно ли как-нибудь "сказать" Lazarus'у чтобы работал с базой в кодировке cp-1251 (выводил такие записи в DBGrid нормально)
Или наоборот Access'у, чтобы позволял отображать и редактировать в кодировке UTF-8?
- EmeraldMan
- постоялец
- Сообщения: 149
- Зарегистрирован: 16.10.2008 08:41:51
- Откуда: Белгород
- Контактная информация:
Наконец разобрался с проблемкой!
Правда вообще третьим способом:
SQLQuery.FieldValues хранит данные как Variant, я их просто их перекодирую с помощью AnsiToUTF8 в доступную для компонент кодировку, чтобы можно было с ней работать, а при выводе в базу соответственно обратно UTF8ToAnsi.
Минус правда есть и довольно весомый - отпадает возможность использования компонент DBGrid, DBEdit и т.д. Вместо них использовать надо обычные StringGrid, Edit и выводить данные туда с помощью того же SQLQuery, правда уже надо вручную прописывать код вывода. Ну и естественно когда меняем содержимое клеточек таблицы, опять надо вручную прописывать SQL запрос для изменения содержимого базы.
И все же подход решает поставленную задачу.
Правда вообще третьим способом:
SQLQuery.FieldValues хранит данные как Variant, я их просто их перекодирую с помощью AnsiToUTF8 в доступную для компонент кодировку, чтобы можно было с ней работать, а при выводе в базу соответственно обратно UTF8ToAnsi.
Минус правда есть и довольно весомый - отпадает возможность использования компонент DBGrid, DBEdit и т.д. Вместо них использовать надо обычные StringGrid, Edit и выводить данные туда с помощью того же SQLQuery, правда уже надо вручную прописывать код вывода. Ну и естественно когда меняем содержимое клеточек таблицы, опять надо вручную прописывать SQL запрос для изменения содержимого базы.
И все же подход решает поставленную задачу.
-
SAK
- постоялец
- Сообщения: 158
- Зарегистрирован: 17.02.2006 23:45:14
- Откуда: Тим
- Контактная информация:
Вообще для решения этой проблемы уже всё предусмотрено, только почему-то не используется:
У TStringField и TMemoField есть свойство Transliterate. В Delphi это свойство по умолчанию true, а в fpc - false.
В Dataset компоненте должен присутствовать метод Translate, который и будет производить перекодировку тогда когда это нужно. При этом DBGrid и DBEdit станут правильно отображать содержимое базы.
Почему это до сих пор не используется мне непонятно.
У TStringField и TMemoField есть свойство Transliterate. В Delphi это свойство по умолчанию true, а в fpc - false.
В Dataset компоненте должен присутствовать метод Translate, который и будет производить перекодировку тогда когда это нужно. При этом DBGrid и DBEdit станут правильно отображать содержимое базы.
Почему это до сих пор не используется мне непонятно.
- EmeraldMan
- постоялец
- Сообщения: 149
- Зарегистрирован: 16.10.2008 08:41:51
- Откуда: Белгород
- Контактная информация:
SAK писал(а):Вообще для решения этой проблемы уже всё предусмотрено, только почему-то не используется:
У TStringField и TMemoField есть свойство Transliterate. В Delphi это свойство по умолчанию true, а в fpc - false.
В Dataset компоненте должен присутствовать метод Translate, который и будет производить перекодировку тогда когда это нужно. При этом DBGrid и DBEdit станут правильно отображать содержимое базы.
Почему это до сих пор не используется мне непонятно.
Честно говоря не понятно как этим пользоваться...
SQLQuery1.Translate('windows-1251','UTF-8',true);
SQLQuery1.Translate('Ansi','UTF-8',true); или как?
-
SAK
- постоялец
- Сообщения: 158
- Зарегистрирован: 17.02.2006 23:45:14
- Откуда: Тим
- Контактная информация:
Метод Translate автоматически вызывается из TStringField.GetValue если свойство Transliterate установлено в true.
Для того что бы это работало надо установить свойство Transliterate у всех полей требующих перекодировки в true (проще всего это сделать установив это свойство в true по умолчанию в конструкторе TStringField.Create в файле fields.inc, с последующей пересборкой fpc) и реализовать метод
Заранее прошу прощения если где-нибудь в коде допустил ошибку, т.к. написал без проверки.
Для того что бы это работало надо установить свойство Transliterate у всех полей требующих перекодировки в true (проще всего это сделать установив это свойство в true по умолчанию в конструкторе TStringField.Create в файле fields.inc, с последующей пересборкой fpc) и реализовать метод
Код: Выделить всё
function TSQLQuery.Translate(Src, Dest: PChar; ToOem: Boolean): Integer;
var s: string;
begin
if Src = nil then begin Result:=0; exit end;
if ToOem then s:=UTF8ToAnsi(src)
else s:=AnsiToUTF8(src);
StrNCopy(Dest, PChar(s), dsMaxStringSize);
Result:=strlen(Dest);
end;
Заранее прошу прощения если где-нибудь в коде допустил ошибку, т.к. написал без проверки.
- EmeraldMan
- постоялец
- Сообщения: 149
- Зарегистрирован: 16.10.2008 08:41:51
- Откуда: Белгород
- Контактная информация:
Спасибо большое!
Буду разбираться.
А вообще какую базу данных для винды лучше использовать (с кодировкой UTF-8) ?
Буду разбираться.
А вообще какую базу данных для винды лучше использовать (с кодировкой UTF-8) ?
EmeraldMan писал(а):А вообще какую базу данных для винды лучше использовать (с кодировкой UTF-8) ?
Любую, которая поддерживает перекодировку на лету, т.е. сам сервер БД перекодирует автоматом, а не Ваша программа. Из тех, с которыми постоянно работаю это FireBird и MySQL. С остальными просто плотно не работал, они наверно тоже подобное поддерживают.
- EmeraldMan
- постоялец
- Сообщения: 149
- Зарегистрирован: 16.10.2008 08:41:51
- Откуда: Белгород
- Контактная информация:
А какую бы программку посоветывали для быстрого создания базы FireBird (чтобы вручную SQL не писать).
Зашел вот на сайт и там на страничке http://www.ibphoenix.com/main.nfs?a=ibp ... dmin_tools Бог знает сколько всяких программок...
Какая на ваш взгляд лучшая?
Зашел вот на сайт и там на страничке http://www.ibphoenix.com/main.nfs?a=ibp ... dmin_tools Бог знает сколько всяких программок...
Какая на ваш взгляд лучшая?
Лучшая - IBExpert.
А под лином я использую FlameRobin.
А под лином я использую FlameRobin.
EmeraldMan
FlameRobin очень простая и (почти
) интуитивно понятна. Я ею в винде пользуюсь. Там даже подсказки есть как в Дельфи.
FlameRobin очень простая и (почти
alexs
Дык его через wine запускать надо.
Дык его через wine запускать надо.
