CP866 в ANSI

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

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

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

CP866 в ANSI

Сообщение Джентельмен »

Есть беда... есть база... парадоксовская... но не суть важно... как мне строку в кодировке cp866 преобразовать в ANSI. Может кто писал уже такие функции... поделитесь опытом...
Аватара пользователя
Attid
долгожитель
Сообщения: 2589
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E
Контактная информация:

Сообщение Attid »

al_exus
новенький
Сообщения: 24
Зарегистрирован: 20.09.2007 00:18:11

Сообщение al_exus »

Если достаточно 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;
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

Если Вы просто смотрите содержимое таблицы в DBGrid, то перекодировку можно сделать средствами самой DBGrid:

Код: Выделить всё

DBGrid.Font.CharSet:=OEM_CHARSET;
Джентельмен
постоялец
Сообщения: 162
Зарегистрирован: 16.10.2005 10:47:26
Откуда: Украина Донбасс Краматорск
Контактная информация:

Сообщение Джентельмен »

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

еще варианты?
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

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

Сообщение alexs »

Если ты под виндой - то там всё перосто - просто сделай визов функции WinAPI, либо посмотри пример из rxFPC функция OemToAnsiStr модуль rxstrutils.pas
Джентельмен
постоялец
Сообщения: 162
Зарегистрирован: 16.10.2005 10:47:26
Откуда: Украина Донбасс Краматорск
Контактная информация:

Сообщение Джентельмен »

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

Сообщение Джентельмен »

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


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

Сообщение 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 таблицам?
Джентельмен
постоялец
Сообщения: 162
Зарегистрирован: 16.10.2005 10:47:26
Откуда: Украина Донбасс Краматорск
Контактная информация:

Сообщение Джентельмен »

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

Сообщение Джентельмен »

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 сохранил... может тут что-то не так я делаю... ну просто подругому как пока не знаю...
Аватара пользователя
alexs
долгожитель
Сообщения: 4067
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

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

Сообщение Джентельмен »

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

Сообщение alexs »

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

просто эти парадоксовые таблицы только в качестве справочника, сконверти их чем нибудь (хотябы темже екселем) в нормальные DBF, с правильной кодировкой, и работай с ними.
Ответить