CP866 в ANSI

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

CP866 в ANSI

Сообщение Джентельмен » 10.11.2007 15:33:28

Есть беда... есть база... парадоксовская... но не суть важно... как мне строку в кодировке cp866 преобразовать в ANSI. Может кто писал уже такие функции... поделитесь опытом...
Джентельмен
постоялец
 
Сообщения: 162
Зарегистрирован: 16.10.2005 10:47:26
Откуда: Украина Донбасс Краматорск

Сообщение Attid » 11.11.2007 11:29:15

Аватара пользователя
Attid
долгожитель
 
Сообщения: 2585
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Сообщение al_exus » 12.11.2007 02:09:13

Если достаточно win1251, то можно так:

Код: Выделить всё
function dos2win(lpStr:String):string;
var
   i,tekasci,newasci   :   Integer;
   newstr   :   String;
begin
   newstr:='';
   for i:=1 to length(lpstr) do begin
      tekasci:=ord(lpStr[i]);
      if tekasci>127 then   begin
              if tekasci<176 then newasci:=tekasci + 64 else begin
            case tekasci of
                   184: newasci:=241;
                   168: newasci:=240;
               else newasci:=tekasci + 16;
             end;
         end;
         end   else begin
         newasci:=tekasci;
      end;
      newstr:=newstr+chr(newasci);
   end;
   dos2win:=newstr;
end;
al_exus
новенький
 
Сообщения: 24
Зарегистрирован: 20.09.2007 00:18:11

Сообщение Vadim » 12.11.2007 09:54:51

Если Вы просто смотрите содержимое таблицы в DBGrid, то перекодировку можно сделать средствами самой DBGrid:
Код: Выделить всё
DBGrid.Font.CharSet:=OEM_CHARSET;
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Джентельмен » 12.11.2007 11:33:30

а нет... все выше перечисленные предложения работают, но не в моей ситуации... у меня беда в том что DBGrid не коректно отображает текст... насколько я понимаю должно быть так:
OEM: Êðàìàòîðñê
ANSI: Краматорск
а у меня: aAuEAAAi#a - ниначто не похоже...
и функции вышепредложенные не работают...

еще варианты?
Джентельмен
постоялец
 
Сообщения: 162
Зарегистрирован: 16.10.2005 10:47:26
Откуда: Украина Донбасс Краматорск

Сообщение Vadim » 12.11.2007 13:26:37

Джентельмен
Значит Вы неправильно описали свою проблему. Если в парадоксовской таблице кодировка ср866 то у Вас должно быть так:
ANSI: Êðàìàòîðñê (или нечто подобное невообразимо тараканье)
OEM: Краматорск.
Но вот судя по этому у Вас перекодировка идёт в еще одну неправильную кодировку.
Вопрос: каким образом Вы определили, что в Ваших таблицах именно cp866?
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение alexs » 12.11.2007 13:27:39

Если ты под виндой - то там всё перосто - просто сделай визов функции WinAPI, либо посмотри пример из rxFPC функция OemToAnsiStr модуль rxstrutils.pas
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4060
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Сообщение Джентельмен » 12.11.2007 14:01:43

а пример можно?
Джентельмен
постоялец
 
Сообщения: 162
Зарегистрирован: 16.10.2005 10:47:26
Откуда: Украина Донбасс Краматорск

Сообщение Джентельмен » 12.11.2007 14:21:38

Vadim писал(а):Джентельмен
Значит Вы неправильно описали свою проблему. Если в парадоксовской таблице кодировка ср866 то у Вас должно быть так:
ANSI: Êðàìàòîðñê (или нечто подобное невообразимо тараканье)
OEM: Краматорск.
Но вот судя по этому у Вас перекодировка идёт в еще одну неправильную кодировку.
Вопрос: каким образом Вы определили, что в Ваших таблицах именно cp866?


в этом меня убедил сам разработчик базы... может вы поможите разобратса?
Джентельмен
постоялец
 
Сообщения: 162
Зарегистрирован: 16.10.2005 10:47:26
Откуда: Украина Донбасс Краматорск

Сообщение alexs » 12.11.2007 14:27:59

Джентельмен
Вот код из Rx
Код: Выделить всё
function OemToAnsiStr(const OemStr: string): string;
begin
  SetLength(Result, Length(OemStr));
  if Length(Result) > 0 then
{$IFDEF WIN32}
    OemToCharBuff(PChar(OemStr), PChar(Result), Length(Result));
{$ELSE}
//    OemToAnsiBuff(@OemStr[1], @Result[1], Length(Result));
{$ENDIF}
end;


не забудь подключить windows

кстати, а каким образом получаете доступ к paradox таблицам?
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4060
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Сообщение Джентельмен » 12.11.2007 16:02:27

вот вместо русских букв вижу только вопросительные знаки... помогите люди добрые...
Джентельмен
постоялец
 
Сообщения: 162
Зарегистрирован: 16.10.2005 10:47:26
Откуда: Украина Донбасс Краматорск

Сообщение Джентельмен » 12.11.2007 16:08:59

alexs писал(а):Джентельмен
Вот код из Rx
Код: Выделить всё
function OemToAnsiStr(const OemStr: string): string;
begin
  SetLength(Result, Length(OemStr));
  if Length(Result) > 0 then
{$IFDEF WIN32}
    OemToCharBuff(PChar(OemStr), PChar(Result), Length(Result));
{$ELSE}
//    OemToAnsiBuff(@OemStr[1], @Result[1], Length(Result));
{$ENDIF}
end;


не забудь подключить windows

кстати, а каким образом получаете доступ к paradox таблицам?


TDbf - с екселем открыл в dbf сохранил... может тут что-то не так я делаю... ну просто подругому как пока не знаю...
Джентельмен
постоялец
 
Сообщения: 162
Зарегистрирован: 16.10.2005 10:47:26
Откуда: Украина Донбасс Краматорск

Сообщение alexs » 12.11.2007 16:33:28

на этапе сохранения в екселе кодировку потерял
посмотри что у тебя в DBF
сразу их переведи в 1251 и не мучайся
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4060
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Сообщение Джентельмен » 12.11.2007 16:38:40

каким компонетом подключитса к DB базе? TDbf не подкючает...
Джентельмен
постоялец
 
Сообщения: 162
Зарегистрирован: 16.10.2005 10:47:26
Откуда: Украина Донбасс Краматорск

Сообщение alexs » 12.11.2007 16:49:57

прямыми нет
как дело обстоит через ODBC - я не знаю, может что и есть

просто эти парадоксовые таблицы только в качестве справочника, сконверти их чем нибудь (хотябы темже екселем) в нормальные DBF, с правильной кодировкой, и работай с ними.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4060
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 52

Рейтинг@Mail.ru