4949
Про СPConvert

Пирожков Вадим


 

> Привет Михаил
> Поковырял твою СPConvert и не понял, а почему DLL'ка аж 90 кил ? Debug ? Wizard ?


Об оптимизации? Хм... у меня даже и мысли такой не было :-) чего в VC получается, то и ладно...

> Потом вызов не очень удобный Вот получилось у меня так

Хм... чего не делай, всегда кому-нибудь и чего-нибудь не понравится, так что я прямо так, в чистом виде, и приведу :-)

> P.S. Извини я readme писать не умею, уж как смог, что бы не перескрипели мозги :-)

Ну-ну... писателями не рождаются :-)

* Ковертор кодовых страниц
* Использует SRC код Михаила Дроздова из CPCONV.CPP
*
* Формат:
* nCPFrom = Code Page исходной строки
* nCPTo = COde Page целевой строки
* cString = Строка для преобразования
*
* Пример Исходная строка 866 -> koi8r -> 1251
*
* ? Conv(20866,1251,Conv(866,20866,ANSITOOEM('Это проверка')))
*
* Не совсем понятно почему не работает 21866 ( а жто что за CODEPAGE ?)
* И некоторые другие, что видимо связано с nLocaleID используемой
* STRCONV, что мою 1049 они ни фига не переваривают.
*
* Пирожков Вадим
* piva@kurgan.isp.ru 
* 
lparameter nCPFrom, nCPTo, m.cString 
Declare Integer MultiByteToWideChar in Win32Api ;
   Integer CODEPAGE ,;
   Integer Flags,;
   String Multi ,;
   Integer LenMutli ,;
   String @ Wide,;
   Integer LenWide 
Declare Integer WideCharToMultiByte in Win32Api ;
   Integer CODEPAGE ,;
   Integer Flags,;
   String Wide ,;
   Integer LenWide ,;
   String @ Multi,;
   Integer LenMulti,;
   string ,;
   string 

Declare Integer IsValidCodePage in Win32Api Integer ;
Integer CodePage
if vartype(nCPFrom)#'N' and IsValidCodePage(nCPFrom) # 1
   MessageBox("Кодовая страница "+Ltrim(Str(nCPFrom);
      +" не поддерживается системой",64)
   Return ""
endif 
If vartype(nCPTo) # 'N' and IsValidCodePage(nCPTo) # 1
   MessageBox("Кодовая страница "+Ltrim(Str(nCPTo);
      +" не поддерживается системой",64)
   Return ""
endif 
if vartype(cString)#'C'
   Return ""
endif 
local buf, out, dst, k, j 
buf=space(len(m.cString)*2) && UNICODE 2 байта на символ
out=space(len(m.cString)*2) && DOUBLEBYTE я думаю тоже 
* Преобразовать строку в UNICODE кодовой страницы nCPFrom
k=MultiByteToWideChar(nCPFrom,1,cString,len(cString),@buf,len(buf))
if k > 0
   dst=left(buf,k*2)
   * Преобразовать строку из UNCODE в кодовую страницу nCPTo
   j=WideCharToMultiByte(nCPTo,0x0200,dst,len(dst),@out,len(out),0,0)
   if j > 0
      * Можно вернуть строку и так
      Return left(out,j/2)
      * Но было бы правильнее преобразовать ее в из doubleByte 
      * Return STRCONV(left(out,j/2),2)
   endif
endif
Return ""

Пирожков Вадим piva@kurgan.isp.ru

 
 
Hosted by uCoz