Форум » Clipper » Конвертация символов в win-кодировку » Ответить

Конвертация символов в win-кодировку

AKudryashov: Есть ли в Clipper'е функция конвертации символов из DOS-кодировки в WIN- кодировку? Если нет как ее реализовать на Clipper'е?

Ответов - 16

Dima: func oemtoansi(srt) local j:=len(srt) local i:=1 local ret:="" local asco:="" for i=1 to j asco:=substr(srt,i,1) if asc(asco)<128 ret+=asco elseif asc(asco)>=128 .and. asc(asco)<=175 ret+=chr(asc(asco)+64) elseif asc(asco)>=224 .and. asc(asco)<=239 ret+=chr(asc(asco)+16) else ret+="" endif next RETURN ret **************************** func ansitoem(srt) local j:=len(srt) local i:=1 local ret:="" local asco:="" for i=1 to j asco:=substr(srt,i,1) if asc(asco)<128 ret+=asco elseif asc(asco)>=192 .and. asc(asco)<=239 ret+=chr(asc(asco)-64) elseif asc(asco)>=240 .and. asc(asco)<=255 ret+=chr(asc(asco)-16) else ret+="" endif next RETURN ret

гость: надо перекодировать строку, которая длиннее 64 кб.... ?

Сергей Р: Что-то типа этого : nRecFl:=fcreate("output_f.txt", 0)//FC_NORMAL) if nRecFl==-1 *Msginfo ("Не создать файл output_f.txt ") return Nil endif diskr=fopen(input_f) nLength:=Fseek(diskr,0,2) fseek(diskr,0) do while nLength > 0 stroka=oemtoansi(freadstr(diskr,1000)) nLength = nLength - len(stroka) fwrite(nRecFl, stroka) enddo fclose(diskr) fclose(nRecFl)


гость: спасибо за ответ - попробую :))

гость: все работает прекрасно) А считывать порциями по 1000 б - это оптимально?..

Сергей Р: Это зависит от того где и как ты используешь программу (например под DOS не желательно делать строки большого размера , а то может и памяти не хватить) , так что тебе решать какой взять размер . 1000 - это с балды , ну если хочешь поставь 65536 .

гость: с большими порциями памяти не хватает - вот и подумалось об оптимальном числе.

гость: так сказать, на все случаи жизни

Dima: гость пишет: так сказать, на все случаи жизни Как вариант. Определи длину файла. Подели скажем ее на 10 (цифирь подбери по своему вкусу). Если 1 кусок получается более чем 64 кило , считывай по 64 кило. Если меньше , считывай по Длина файла/10

Гость: можно ли oem-текст перекодировать в текст формата rtf ? Файл, перекодированный с помощью oemtoansi, не поддерживает форматирование.

Гость: или не oem, а ansi-файл в rtf-файл?

Петр: Гость пишет: Файл, перекодированный с помощью oemtoansi, не поддерживает форматирование. Текстовый файл перекодированный с oem в ansi продолжает оставаться текстовым файлом . RTF содержит собственно как сам текст, так и управляющие символы (слова). Более подробно о формате можете узнать здесь Правда описание не полное, но для начала хватит Ниже приведен код для конвертации с plain text в RTF для использования с [x] Harbour, думаю, что разобраться и перевести на Clipper будет не тяжело, как и дополнить новыми упр.символами ( см.выше указанную ссылку) И еще RTF RTFу рознь Это я о MS Office и OpenOffice, они, например, по разному сохраняют рисунки, но это так, мелочи. // // $Id: rtfclass.prg,v 1.1.1.1 2001/12/21 10:46:25 ronpinkas Exp $ // /* * harbour rtfclass demo * notes : - raw enough but it works - using hb_f*() - some compilers are not friendly with this :( - rtf is assumed to have association * initial release : 23 June 1999 Andi Jahja * this program compiles fine on Borland C/C++ 5.0 * tested under Windows 98 only with RTF associated to Winword * works with printable ascii only * placed in the public domain */ #define CRLF CHR(13) + CHR(10) function main() local ortf := trtf():new("test.rtf") local htest := fcreate( "rtf_test.txt") local ctest := "" // create a plain text file ctest += "This is +bHarbour c RTF Class-b" + CRLF ctest += "THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG" + CRLF ctest += "+bTHE QUICK BROWN FOX JUMPS OVER THE LAZY DOG-b" + CRLF ctest += "+iTHE QUICK BROWN FOX JUMPS OVER THE LAZY DOG-i" + CRLF ctest += "+buTHE QUICK BROWN FOX JUMPS OVER THE LAZY DOG-bu" + CRLF ctest += "+buiTHE QUICK BROWN FOX JUMPS OVER THE LAZY DOG-bui" + CRLF ctest += "THE +bQUICK-b +buBROWN-bu +buiFOX-bui +iJUMPS-i +uOVER-u +ilTHE-il +uLAZY-u +buDOG-bu" + CRLF fwrite( htest, ctest ) fclose( htest ) // convert text file to rtf ortf:write("rtf_test.txt") ortf:close() // execute file association ( windows only ) if lower( os() ) == "windows" // assuming start.exe is exist __run( "start test.rtf" ) endif return nil function trtf() static oclass if oclass == nil oclass = HBClass():new( "trtf" ) oclass:adddata( "nhandle" ) oclass:addmethod( "new", @new() ) oclass:addmethod( "write", @write() ) oclass:addmethod( "close", @close() ) oclass:create() endif return oclass:instance() static function new( cfilename ) local self := qself() ::nhandle = fcreate( cfilename ) fwrite( ::nhandle,; "{\rtf1\ansi\deff0{\fonttbl {\f0\fnil\fcharset0 Courier New;}{\f1\fnil\fcharset0 Arial;}}"+; "\uc1\pard\lang1033\ulnone\f0\fs20"+CRLF) return self static function write( csource ) local self := qself() local cchar, cline, xatt, i, _xatt local n, nchar, xchar, y // These are character attributes, self-defined // + means a turn-on // - means a turn-off local attrib := {; { "+b" , "\b " } /* turn bold on*/ ,; { "+bu" , "\ul\b " } /* turn bold_underline on */ ,; { "+bi" , "\b\i " } /* turn bold_italic on */ ,; { "+bui", "\ul\b\i " } /* turn bold_underline_italic on */ ,; { "+i" , "\i " } /* turn italic on */ ,; { "+il" , "\ul\i " } /* turn italic_underline on */ ,; { "+u" , "\ul " } /* turn underline on */ ,; { "-b" , "\b0 " } /* turn bold off */ ,; { "-bu" , "\b0\ulnone " } /* turn bold_underline off */ ,; { "-bi" , "\b0\i0 " } /* turn bold_italic off */ ,; { "-bui", "\b0\i0\ulnone " } /* turn bold_underline_italic off */,; { "-i" , "\i0 " } /* turn italic off */ ,; { "-il" , "\ulnone\i0 " } /* turn italic_underline off */ ,; { "-u" , "\ulnone " } /* turn underline off */ } hb_fuse( csource ) // open source file while !hb_feof() // read the file line by line cline := hb_freadln() + "\par" y := len( cline ) for nchar := 1 to y cchar := substr( cline, nchar, 1 ) // todo : i need function dec2hex() // to convert ascii to 2-characters hex // ie : dec2hex( "H" ) -> 48 if cchar == "+" .or. cchar == "-" xatt := cchar + ; substr( cline, nchar + 1, 1 ) + ; substr( cline, nchar + 2, 1 ) + ; substr( cline, nchar + 3, 1 ) if ( i := ascan( attrib, { |e| e[1] == xatt } ) ) > 0 fwrite( ::nhandle, attrib[2] ) nchar := nchar + len( xatt ) - 1 else // 3 attributes xatt := left( xatt, 3 ) if ( i := ascan( attrib, { |e| e[1] == xatt } ) ) > 0 fwrite( ::nhandle, attrib[2] ) nchar := nchar + len( xatt ) - 1 else // 2 attributes xatt := left( xatt, 2 ) if ( i := ascan( attrib, { |e| e[1] == xatt } ) ) > 0 fwrite( ::nhandle, attrib[2] ) nchar := nchar + len( xatt ) - 1 else fwrite( ::nhandle, cchar ) endif endif endif else fwrite( ::nhandle, cchar ) endif next fwrite( ::nhandle, CRLF ) hb_fskip() // read next line enddo hb_fuse() return ( self ) static function close() local self := qself() fwrite( ::nhandle, "\f1\fs16\par"+CRLF+"}" ) fclose( ::nhandle ) return self

Гость: Петр, спасибо большое, попытаюсь разобраться...

Гость: для меня сложновато.. Выкрутилась созданием вордовского макроса - форматирование ansi-текста и сохранение либо в word doc-, либо в rtf- формате

imar2: Прошло много времени, но подобные вопросы еще актуальны. Все это очень помогло, спасибо. Но есть еще один нюанс: в функции oemtoansi символы псевдографики ( CHR(176)-CHR(223) ) заменяются пробелами. А как бы их тоже конвертировать в ansi? Помогите, если можете ...

and3081: > в функции oemtoansi символы псевдографики ( CHR(176)-CHR(223) ) заменяются пробелами в Win 1251 графику не перекодировать. Надо использовать Unicode. По простому примерно так: * D86W12(c) - 866 to 1251 *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Func d86w12(c) local r1:='',r2,r3:=len(c) If !empty(c) For r2=1 to r3 r4=asc(substr(c,r2,1)) If r4=252 // N_ r4=185 ElseIf r4=240 // Ё r4=168 ElseIf r4=241 // ё r4=184 ElseIf r4>=128.and.r4<=175 r4+=64 ElseIf r4>=224.and.r4<=239 r4+=16 Endif r1+=chr(r4) Next Else r1=c // если одни пробелы Endif return r1 * D86UNI(c) - 866 to Unicode LE *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Func d86uni(c) local r1:='',r2,r3:=len(c) static m:={145,146,147, 2,36,97,98, 86, 85,99, 81, 87, 93, 92, 91, 16,; 20, 52, 44,28, 0,60,94, 95, 90,84,105,102, 96, 80,108,103,; 104,100,101,89,88,82,83,107,106,24, 12,136,132,140,144,128} If r3>0 For r2=1 to r3 r4=asc(substr(c,r2,1)) If r4=252 // N_ r4=chr(22)+chr(33) ElseIf r4=240 // Ё r4=chr(01)+chr(04) ElseIf r4=241 // ё r4=chr(81)+chr(04) ElseIf r4>=128.and.r4<=175 r4=chr(16+r4-128)+chr(04) ElseIf r4>=224.and.r4<=239 r4=chr(64+r4-224)+chr(04) ElseIf r4>=176.and.r4<=223 // графика r4=chr(m[r4-175])+chr(37) Else r4=chr(r4)+chr(0) Endif r1+=r4 Next Endif return r1



полная версия страницы