Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> кодировки 
:(
    Опции темы
Гость_qwerty
Дата 28.7.2004, 13:18 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Нашел тут в MSDN библиотеку mlang.dll, которая якобы должна перекодировать строки в разные кодировки !!!!

Собственно задача в этом стоит - перекодировать из одной кодировки в другую.

Например koi8r в cp1251 (сразу говорю таблицы не катят, этож на каждую кодировку таблица нужна).

Библиотека эта поддерживает com, но как загрузить ее !!!???? импорт не проходит никак???

  Вверх
Maverick
Дата 28.7.2004, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1307
Регистрация: 22.9.2003
Где: Odessa, Ukraine

Репутация: нет
Всего: 10



Перекодируй сам... в чем проблема?

Код

//процедура перекодировки из WINDOS в UNIX
function cod2max(s:string):string;
var i:integer;
begin
for i:=1 to length(s) do
begin
if (ord(s[i])>175) and (ord(s[i])<192)  then s[i]:= chr(ord(s[i])+64) else
if ord(s[i])>191 then s[i]:= chr(ord(s[i])-16);
end;
result:=s
end;

//процедура перекодировки из UNIX в Windows
function max2win(s:string):string;
var i:integer;
begin
for i:=1 to length(s) do
begin
if (ord(s[i])>239)  then s[i]:= chr(ord(s[i])-64) else
if ord(s[i])>175 then s[i]:= chr(ord(s[i])+16);
end;
result:=s
end;

//процедура перекодировки из DOS в UNIX
function dos2max(s:string):string;
var i:integer;
begin
for i:=1 to length(s) do
if (ord(s[i])>127) and (ord(s[i])<176)
then s[i]:= chr(ord(s[i])+48) else
if (ord(s[i])>175) and (ord(s[i])<224)
then s[i]:= chr(ord(s[i])-48);
result:=s
end;


Что-то такое... выдрал из старого проекта.... я думаю и для кои8 написать можно подобное...


--------------------
smile
PM ICQ GTalk   Вверх
Гость_qwerty
Дата 28.7.2004, 14:15 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











да проблемы в этом нет.... но ты загляни в эксплорер в раздел кодировки и сразу поймешь в чем проблема.... там слишком много кодировок, вот в чем проблема.
зачем столько писать если уже есть библиотека
  Вверх
Girder
Дата 28.7.2004, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: 25
Всего: 155



qwerty, ты б зарегился.

Читаем:
1) Кодовые страницы
2) ConvertINetString

Ну а далее, как два байта переслать:
Основная функция:
Код
function ConvertStr(dwSrcEncoding,dwDstEncoding:DWord;
                          SrcStr,DestStr:PChar;SizeSrc:integer;var SizeDest:integer):Integer;
var ps,pd:Pointer;
   MLangHandle:THandle;
   fStrConvert:Pointer;
begin
Result:=-1;
MLangHandle:=LoadLibrary(PChar('MLang.dll'));
if MLangHandle<>0 then
 begin
  fStrConvert:=GetProcAddress(MLangHandle,'ConvertINetString');
  if Assigned(fStrConvert) then
   begin
    ps:=@SizeSrc;
    pd:=@SizeDest;
    asm
     pushfd
     pusha
     mov eax,pd
     push eax
     mov eax,DestStr
     push eax
     mov eax,ps
     push eax
     mov eax,SrcStr
     push eax
     push dword ptr dwDstEncoding
     push dword ptr dwSrcEncoding
     push dword ptr 0
     call fStrConvert
     mov Result,eax
     popa
     popfd
    end;
   end;
  FreeLibrary(MLangHandle);
 end;
end;
где: dwSrcEncoding - кодировка исходного текста(SrcStr);
dwDstEncoding - кодировка ответа(DestStr);

Формат использования:
Код
unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;

type
 TForm1 = class(TForm)
   Button1: TButton;
   Edit1: TEdit;
   Memo1: TMemo;
   Button2: TButton;
   procedure Button1Click(Sender: TObject);
   procedure Button2Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
   function ConvertStr(dwSrcEncoding,dwDstEncoding:DWord;
                       SrcStr,DestStr:PChar;SizeSrc:integer;var SizeDest:integer):integer;
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

function TForm1.ConvertStr(dwSrcEncoding,dwDstEncoding:DWord;
                          SrcStr,DestStr:PChar;SizeSrc:integer;var SizeDest:integer):Integer;
var ps,pd:Pointer;
   MLangHandle:THandle;
   fStrConvert:Pointer;
begin
Result:=-1;
MLangHandle:=LoadLibrary(PChar('MLang.dll'));
if MLangHandle<>0 then
 begin
  fStrConvert:=GetProcAddress(MLangHandle,'ConvertINetString');
  if Assigned(fStrConvert) then
   begin
    ps:=@SizeSrc;
    pd:=@SizeDest;
    asm
     pushfd
     pusha
     mov eax,pd
     push eax
     mov eax,DestStr
     push eax
     mov eax,ps
     push eax
     mov eax,SrcStr
     push eax
     push dword ptr dwDstEncoding
     push dword ptr dwSrcEncoding
     push dword ptr 0
     call fStrConvert
     mov Result,eax
     popa
     popfd
    end;
   end;
  FreeLibrary(MLangHandle);
 end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var Str,Buf:string;
   i:integer;
begin
Str:=Edit1.Text;
i:=Length(Str)*2+1;
SetLength(Buf,i);
if ConvertStr(20866,1251,PChar(Str),PChar(Buf),Length(Str),i)=0 then
 memo1.Text:=copy(Buf,1,i);
end;

procedure TForm1.Button2Click(Sender: TObject);
var Str,Buf:string;
   i:integer;
begin
Str:=Edit1.Text;
i:=Length(Str)*2+1;
SetLength(Buf,i);
if ConvertStr(1251,20866,PChar(Str),PChar(Buf),Length(Str),i)=0 then
 memo1.Text:=copy(Buf,1,i);
end;

end.


Удачи.

Это сообщение отредактировал(а) Girder - 29.7.2004, 10:41


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
Гость_qwerty
Дата 29.7.2004, 08:33 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











ну ты просто маньяк ассемблера biggrin.gif
  Вверх
qwerty=-=root
Дата 29.7.2004, 09:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 29.7.2004

Репутация: 1
Всего: 1



пишу значится такой код, но результата нет !!!?????

Код

type
TConvertFunction = function( lpdwMode: LPDWORD;
                             dwSrcEncoding: DWORD;
                             dwDstEncoding: DWORD;
                             lpSrcStr: PChar;
                             lpnSrcSize: pointer;
                             var lpDstStr: PChar;
                             var lpnDstSize: pointer
                            ): HRESULT;
var
  ConvertFunction: TConvertFunction;

begin

    dll := LoadLibrary('mlang.dll');
    if (dll <= 0) then
       raise Exception.Create('Can''t load  mlang.dll!');
    @ConvertFunction := GetProcAddress(dll,'ConvertINetString');
    if not Assigned(@ConvertFunction) then
      begin
        if (dll > 0) then
           FreeLibrary(dll);
        dll := 0;
        raise Exception.Create('Can''t load function ConvertINetString');
     end;

    sizeSrc := Length( Src )*2+1;
    SetLength(Dest, sizeSrc);
    buf := PChar(Dest);
    ps:=@sizeSrc;
    pd:=@sizeDest;
    rs := ConvertFunction(0, src_cp, dest_cp,
                          PChar(Src), ps,
                          buf, pd);


Это сообщение отредактировал(а) qwerty=-=root - 29.7.2004, 09:34
PM MAIL   Вверх
Girder
Дата 29.7.2004, 10:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: 25
Всего: 155



qwerty=-=root и Гость_qwerty - это один человек? Зарегился на конец-то?

Подправил твой код, но вылизовать(не влане ошибок) тебе придется его самому:
Код
procedure TForm1.Button1Click(Sender: TObject);
type
TConvertFunction = function( lpdwMode: LPDWORD;
                            dwSrcEncoding: DWORD;
                            dwDstEncoding: DWORD;
                            lpSrcStr: PChar;
                            lpnSrcSize: pointer;
                            lpDstStr: PChar;
                            lpnDstSize: pointer
                           ): HRESULT; stdcall;
var
 ConvertFunction: TConvertFunction;
 dll:THandle;
 sizeSrc,sizeDest:integer;
 Src,Dest:string;
 Buf:PChar;
 ps,pd:Pointer;
 rs:Hresult;
begin

   dll := LoadLibrary('mlang.dll');
   if (dll <= 0) then
      raise Exception.Create('Can''t load  mlang.dll!');
   @ConvertFunction := GetProcAddress(dll,'ConvertINetString');
   if not Assigned(@ConvertFunction) then
     begin
       if (dll > 0) then
          FreeLibrary(dll);
       dll := 0;
       raise Exception.Create('Can''t load function ConvertINetString');
    end;
   Src:=Edit1.Text;
   sizeSrc:=Length( Src );
   sizeDest := sizeSrc*2+1;
   SetLength(Dest, sizeDest);
   buf := PChar(Dest);
   ps:=@sizeSrc;
   pd:=@sizeDest;
   rs := ConvertFunction(Dword(0), 1251, 20866,
                         PChar(Src), ps,
                         buf, pd);
   edit2.Text:=copy(Dest,1,sizeDest);
   FreeLibrary(dll);
end;


Удачи.

Это сообщение отредактировал(а) Girder - 11.2.2005, 10:23


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
qwerty=-=root
Дата 29.7.2004, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 29.7.2004

Репутация: 1
Всего: 1



пасиб..... зарегился угу
Добавлено @ 10:55
еще раз спасиб.....
работает гуд, оформил тему эту в класс...
такой еще вопросик???
Может функция какая есть для получения всех установленных кодировок???
PM MAIL   Вверх
Girder
Дата 29.7.2004, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: 25
Всего: 155



Цитата
пишу значится такой код, но результата нет !!!?????
забыл спросить: А че c asm-ом не понравилось?

Цитата
Может функция какая есть для получения всех установленных кодировок???
Всмысле?


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
qwerty=-=root
Дата 29.7.2004, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 29.7.2004

Репутация: 1
Всего: 1



да не то чтоб не понравилось.... просто уже написал на pascal, но чтото не фурычало.....

а функция ..... ну к примеру эксплорер берет эту инфу об установленных кодировках????
ну вот может кто знает это место???
PM MAIL   Вверх
Girder
Дата 29.7.2004, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: 25
Всего: 155



Да полно способов.
Самый простой:
Код
function EnumCodePagesProc(lpCodePageString:PAnsiChar):integer; stdcall;
begin
form1.Memo1.Lines.Add(lpCodePageString);
Result:=1;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Memo1.Clear;
Memo1.Lines.Add('Установленные');
if EnumSystemCodePages(@EnumCodePagesProc,CP_INSTALLED) then
 Memo1.Lines.Add('Ok') else Memo1.Lines.Add('Error');
Memo1.Lines.Add('Потдерживаемые');
if EnumSystemCodePages(@EnumCodePagesProc,CP_SUPPORTED) then
 Memo1.Lines.Add('Ok') else Memo1.Lines.Add('Error');
end;

Через COM можно получить более подробный результат, можно от сюда выдирать: HKEY_CLASSES_ROOT\MIME\Database, есть ещё способы.

Почитай, очень много информации: http://msdn.microsoft.com/library/en-us/wc...LanguageAPI.asp

P.S. у Mlang есть очень интересная функция: IsConvertINetStringAvailable


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
qwerty=-=root
Дата 29.7.2004, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 29.7.2004

Репутация: 1
Всего: 1



IsConvertINetStringAvailable - функция конечно хорошая, но у меня идет сопоставление типа:
windows-1251 по нему ищу 1251 или koi8-r, тогда 20866. Так что мне надо получить именно этот идентификатор из описания....

Код конечно тоже класный, но он мне не дает нужного результата...

HKEY_CLASSES_ROOT\MIME\Database - вот это самое интересное !!!!

смотреть надо charset и строчку в hex internetencoding

еще раз пасиб !!!!
PM MAIL   Вверх
Girder
Дата 29.7.2004, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: 25
Всего: 155



Помоему лудше будет так:
а)построить предворительную таблицу по анализу ветки CodePage.
Смотри:
1)Номер есть +
2)Description есть + (а-ля IE)
3)WebCharset, а если его нет, то смотрим BodyCharset +
4)Шрифты есть +


б)Далее до заполнить таблицу по анализу ветки Charset

в)и окончательно, через EnumSystemCodePages разбросать: что установленно, а что нет...

Удачи.
Добавлено @ 15:32
А на счет IsConvertINetStringAvailable, я тебе по другому поводу постил.

Это сообщение отредактировал(а) Girder - 29.7.2004, 15:30


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
qwerty=-=root
Дата 29.7.2004, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 29.7.2004

Репутация: 1
Всего: 1



я уже так и сделал
Добавлено @ 15:52
там еще alias есть, типа ссылка на другую кодировку, тож надо учесть !!!!
PM MAIL   Вверх
qwerty=-=root
Дата 30.7.2004, 08:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 29.7.2004

Репутация: 1
Всего: 1



Значится так !!!
1)Типа структура для кодировок
Код

 TCodePageType = class
   charset: string;                    //koi8-r или windows-1251
   codepage: integer;              //20866 или 1251
   aliasforcharset: string;        // ссылочка на charset, название короче  
 end;
 
 TCodes = array of TCodePageType;

2) Читаем доступные кодировки из HKEY_CLASSES_ROOT\MIME\Database
Код

procedure ReadCodePages;
var
 reg: TRegistry;
 Myst: TStringList;
 i: integer;
 jk: string;
 st, prev: string;
begin

 reg := TRegistry.Create(KEY_READ);
 reg.RootKey := HKEY_CLASSES_ROOT;
 if reg.OpenKeyReadOnly('MIME\Database\Charset') then
   begin
     Myst := TStringList.Create;
     reg.GetKeyNames( Myst );
     prev := reg.CurrentPath;
     SetLength(FCodes, MySt.Count);
     for i:=0 to MySt.Count-1 do
       begin
         st := MySt.Strings[i];
         FCodes[i] := TCodePageType.Create;
         FCodes[i].charset := st;
         reg.OpenKeyReadOnly( prev );
         if reg.OpenKeyReadOnly(st) then
           begin
             if reg.ValueExists('AliasForCharset') then
                FCodes[i].aliasforcharset := reg.ReadString('AliasForCharset');
             if reg.ValueExists('InternetEncoding') then
                FCodes[i].codepage := reg.ReadInteger('InternetEncoding');
           end;
         reg.CloseKey;
       end;
     Myst.Free;
   end;
 reg.CloseKey;
 reg.Free;
end;


Да и не забудьте через EnumSystemCodePages найти установленные !!!!
Добавлено @ 08:11
функцию поиска думаю писать ни к чему

Это сообщение отредактировал(а) qwerty=-=root - 30.7.2004, 08:14
PM MAIL   Вверх
StayAtHome
Дата 31.7.2004, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Домосед
**


Профиль
Группа: Участник
Сообщений: 456
Регистрация: 26.1.2004
Где: Украина

Репутация: нет
Всего: 16



Товарищи, а такой темы в DRKB нету. Большая просьба добавить. rolleyes.gif
PM MAIL WWW ICQ YIM   Вверх
qwerty=-=root
Дата 2.8.2004, 08:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 29.7.2004

Репутация: 1
Всего: 1



Куда куда добавить????
PM MAIL   Вверх
Girder
Дата 2.8.2004, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: 25
Всего: 155



qwerty=-=root читай здесь http://forum.vingrad.ru/index.php?showtopic=22229&st=0



--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
Nicholas
Дата 27.12.2004, 09:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 436
Регистрация: 30.9.2004

Репутация: нет
Всего: 0



Люди, я вообще чайник дайте мне рабочии процедуры перекодировки из 866 в 1251, мне надо в мемо считать TXT в дос кодировке!!!

smile
PM MAIL ICQ   Вверх
Alex
Дата 11.2.2005, 08:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4147
Регистрация: 25.3.2002
Где: Москва

Репутация: 6
Всего: 162



Цитата(Nicholas @ 27.12.2004, 09:09)
Люди, я вообще чайник дайте мне рабочии процедуры перекодировки из 866 в 1251, мне надо в мемо считать TXT в дос кодировке!!!

Код

function OEM2Ansi(const S : string) : string;
// Конвертирует строку из кодировки DOS в Windows кодировку
begin
 SetLength(Result,Length(S));
 if  Length(S) <> 0  then
   OemToChar(pChar(S),pChar(Result));
end;

Добавлено @ 08:02
Цитата(StayAtHome @ 31.7.2004, 12:39)
Товарищи, а такой темы в DRKB нету. Большая просьба добавить. 

В DRKB не обещаю, а в FAQ обязательно добавлю.


--------------------
Написать можно все - главное четко представлять, что ты хочешь получить в конце. 
PM Skype   Вверх
Гость_Nicholas
Дата 15.6.2005, 17:53 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Давненько я сюда не заглядывал...
smile

Цитата(Alex @ 11.2.2005, 08:01)
function OEM2Ansi(const S : string) : string;
// Конвертирует строку из кодировки DOS в Windows кодировку
begin
SetLength(Result,Length(S));
if  Length(S) <> 0  then
  OemToChar(pChar(S),pChar(Result));
end;


Сейчас уже не помню, но кажется буквы "к" и еще какие-то не корректно конвертирует.

После длительного мучения с разными кодировками - пришел к выводу, что таблицы для каждой кодировки это очень правильно, хотя иногда и нудно! smile
  Вверх
splash666
Дата 13.12.2005, 19:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 15.7.2005
Где: Россия, г.Самара

Репутация: нет
Всего: нет



Хорошая тема. Может и мне поможете? У меня есть файл. Частично забит мусором, но в нём встречаются предожения в UCS2 Big Endian. Как мне всё это дело вывести в memo? Сторонние компоненты не катят. либо платные, либо бесполезные. Хотелось бы процедуру перекодировки. Но на MS сайте не нашёл ни одного упоминания об UCS2... Помогите!
PM MAIL ICQ   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.1455 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.