On-line: Haz, гостей 1. Всего: 2 [подробнее..]
АвторСообщение



Не зарегистрирован
Зарегистрирован: 01.01.70
ссылка на сообщение  Отправлено: 23.09.05 13:39. Заголовок: Конвертация символов в win-кодировку


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

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 16 [только новые]


администратор




Не зарегистрирован
Зарегистрирован: 01.01.70
ссылка на сообщение  Отправлено: 23.09.05 14:13. Заголовок: Re:


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


Спасибо: 0 
ПрофильЦитата Ответить



Не зарегистрирован
Зарегистрирован: 01.01.70
ссылка на сообщение  Отправлено: 03.04.06 10:57. Заголовок: а если srt больше 64 кб?


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

Спасибо: 0 
Цитата Ответить





Не зарегистрирован
Зарегистрирован: 01.01.70
ссылка на сообщение  Отправлено: 03.04.06 12:01. Заголовок: Re:


Что-то типа этого :

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)




Спасибо: 0 
ПрофильЦитата Ответить



Не зарегистрирован
Зарегистрирован: 01.01.70
ссылка на сообщение  Отправлено: 03.04.06 12:10. Заголовок: Re:


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

Спасибо: 0 
Цитата Ответить



Не зарегистрирован
Зарегистрирован: 01.01.70
ссылка на сообщение  Отправлено: 05.04.06 04:56. Заголовок: Re:


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

Спасибо: 0 
Цитата Ответить





Не зарегистрирован
Зарегистрирован: 01.01.70
ссылка на сообщение  Отправлено: 05.04.06 07:46. Заголовок: Re:


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

Спасибо: 0 
ПрофильЦитата Ответить



Не зарегистрирован
Зарегистрирован: 01.01.70
ссылка на сообщение  Отправлено: 05.04.06 08:21. Заголовок: Re:


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

Спасибо: 0 
Цитата Ответить



Не зарегистрирован
Зарегистрирован: 01.01.70
ссылка на сообщение  Отправлено: 05.04.06 08:22. Заголовок: Re:


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

Спасибо: 0 
Цитата Ответить
администратор




Не зарегистрирован
Зарегистрирован: 01.01.70
ссылка на сообщение  Отправлено: 05.04.06 08:46. Заголовок: Re:


гость пишет:

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


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


Спасибо: 0 
ПрофильЦитата Ответить



Не зарегистрирован
Зарегистрирован: 01.01.70
ссылка на сообщение  Отправлено: 28.11.06 12:29. Заголовок: Re:


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

Спасибо: 0 
Цитата Ответить



Не зарегистрирован
Зарегистрирован: 01.01.70
ссылка на сообщение  Отправлено: 28.11.06 13:07. Заголовок: Re:


или не oem, а ansi-файл в rtf-файл?

Спасибо: 0 
Цитата Ответить
постоянный участник


Пост N: 42
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 28.11.06 23:13. Заголовок: Re:


Гость пишет:

 цитата:
Файл, перекодированный с помощью 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


Спасибо: 0 
ПрофильЦитата Ответить



Не зарегистрирован
Зарегистрирован: 01.01.70
ссылка на сообщение  Отправлено: 08.12.06 13:39. Заголовок: Re:


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

Спасибо: 0 
Цитата Ответить



Не зарегистрирован
Зарегистрирован: 01.01.70
ссылка на сообщение  Отправлено: 08.12.06 14:37. Заголовок: Re:


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

Спасибо: 0 
Цитата Ответить



Не зарегистрирован
Зарегистрирован: 01.01.70
ссылка на сообщение  Отправлено: 08.10.09 06:43. Заголовок: Прошло много времени..


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

Спасибо: 0 
Цитата Ответить



Не зарегистрирован
Зарегистрирован: 01.01.70
ссылка на сообщение  Отправлено: 12.10.09 12:53. Заголовок: 1251 и unicode


> в функции 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


Спасибо: 0 
Цитата Ответить
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 110
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет