"Goran Markovic" <mark...@yahoo.com> wrote in message
news:ijtgan$foe$1...@news.teol.net...
> Pozzz ljudi...
> Iz aplikacije exportujem tekstualni file...Kako da postavim da encoding u
> tekstualnoj datoteci po defaultu bude UTF-8 a ne ANSI...Veliki pozzz
Evo ti moj convert.clw modul za konverziju znakova (inace su to dvije source
procedure)
Rad pocinje pozivom InitCP a zatim radis ConvertCP
Unutra ti je i Misc.ToUTF8 procedura koju vjerojatno ti trebas a za nju
trebas u global map dodati i ovo:
--
Z. <(-e)kas
MODULE('Api')
CoTaskMemAlloc( LONG cb ), LONG, PASCAL
CoTaskMemFree( LONG lpVoid ),PASCAL
CoTaskMemReAlloc( LONG lpVoid, LONG cb ), LONG, PASCAL
SysAllocString( LONG lpWideStr ), LONG, PASCAL
SysFreeString( LONG lpBstr ), PASCAL
MemSet(LONG , BYTE , LONG ), NAME('_memset')
MultiByteToWideChar(LONG, LONG, LONG, LONG, LONG, LONG), LONG, PASCAL,
PROC
WideCharToMultiByte(LONG, LONG, LONG, LONG, LONG, LONG, LONG=0, LONG=0 ),
LONG, PASCAL, PROC
memcpy(LONG, LONG, LONG), LONG, PROC, NAME('_memcpy')
lstrlenW(LONG lpWStr ), LONG, PASCAL, NAME('lstrlenw')
lstrcatW(LONG lpWStr1,LONG lpWStr2 ), LONG, PASCAL, PROC, NAME('lstrcatw')
lStrLen(LONG lpStr),LONG, PASCAL, NAME('lStrLenA')
END
MEMBER('Proba.clw') ! This is a
MEMBER module
MAP
INCLUDE('MISCCNV.INC'),ONCE !Local module
procedure declarations
END
ConvertCP PROCEDURE (p_FromCP,p_ToCP,p_Line) ! Declare
Procedure
CP_ACP EQUATE(0) ! u svapi.inc
CP_UTF8 EQUATE(65001)
DoubleNull EQUATE(2)
SingleNull EQUATE(1)
BytesPerWideChar EQUATE(2)
Misc CLASS
ToUTF8 PROCEDURE(*STRING p_Text,LONG p_ForceLength = 0),BYTE
FromUTF8 PROCEDURE(*STRING p_Text,BYTE p_FreeUTF8 = 0),BYTE
END
Pos USHORT
FromCP STRING(10)
ToCP STRING(10)
!LineTxt STRING(255)
LineTxt &STRING
LineTxtLength USHORT
ConvQueue QUEUE
CharPos USHORT
END
CODE
FromCP = p_FromCP
ToCP = p_ToCP
LineTxtLength = LEN(CLIP(p_Line))
!LineTxt = CLIP(p_Line)
IF ToCP = '<0>UTF8'
LineTxt &= NEW(STRING(LineTxtLength*2)) ! Dvostruko vise znakova
ELSE
LineTxt &= NEW(STRING(LineTxtLength))
END
LineTxt = p_Line
IF FromCP = '<0>UTF8'
IF Misc.FromUTF8(LineTxt,TRUE) = Level:Benign
p_Line = LineTxt
END
ELSIF ToCP = '<0>UTF8'
IF Misc.ToUTF8(LineTxt,0) = Level:Benign
p_Line = LineTxt
END
ELSE
IF LineTxt
! MESSAGE(LineTxt &'--'& FromCP &'--'& ToCP) ! Neke kodne tabele
iamju iste znakove na razlicitim mjestima npr d u 1250 je D u 852
LOOP X# = 1 TO 10 ! te se mora ici znak po
znak
Pos = 0
LOOP
Pos = INSTRING(FromCP[X#],LineTxt,1,Pos+1)
IF ~Pos THEN BREAK.
ConvQueue.CharPos = Pos
GET(ConvQueue,+ConvQueue.CharPos)
IF ~ERRORCODE() THEN CYCLE.
! MESSAGE(X# &' '& POS)
LineTxt[Pos] = ToCP[X#]
ConvQueue.CharPos = Pos
ADD(ConvQueue,+ConvQueue.CharPos)
ASSERT(~ERRORCODE(),'Dodavanje konvertiranih u queue')
END
END
FREE(ConvQueue)
p_Line = LineTxt
END
END
DISPOSE(LineTxt)
!RETURN LineTxt
Misc.ToUTF8 PROCEDURE(*STRING p_Text,LONG p_ForceLength = 0 )
lpUTF8 LONG(0)
LenghtUTF8 LONG
TextUTF8 &STRING
Lenght LONG,AUTO
ReturnValue BYTE(Level:Fatal)
BytesNeeded LONG,AUTO
WideCharNeeded LONG,AUTO
lpWideStr LONG(0)
CODE
LOOP
IF p_ForceLength
IF p_ForceLength > SIZE(p_Text)
MESSAGE('String to short for the forced length.')
BREAK
END
Lenght = p_ForceLength
ELSE
Lenght = LEN(CLIP(p_Text))
END
IF Lenght <= 0
lpUTF8 = CoTaskMemAlloc(SingleNull)
IF lpUtf8 = 0
MESSAGE('Out of memory allocating a wide string.')
ELSE
Memset(lpUTF8,0,SingleNull)
ReturnValue = Level:Benign
End
BREAK
END
WideCharNeeded =
MultiByteToWideChar(CP_ACP,0,ADDRESS(p_Text),Lenght,0,0)
IF WideCharNeeded = 0
MESSAGE('Preparing to converting a ANSI string to a wide string
failed.')
BREAK
END
BytesNeeded = WideCharNeeded * BytesPerWideChar
lpWideStr = CoTaskmemAlloc(BytesNeeded+DoubleNull)
IF lpWideStr = 0
MESSAGE('Out of memory allocating a wide string.')
BREAK
END
IF
MultiByteToWideChar(CP_ACP,0,ADDRESS(p_Text),Lenght,lpWideStr,BytesNeeded) =
0
MESSAGE('Converting a ANSI string to a wide string failed.')
BREAK
ELSE
ReturnValue = Level:Benign
END
Memset(lpWideStr+BytesNeeded,0,DoubleNull)
BytesNeeded = WideCharToMultiByte(CP_UTF8,0,lpWideStr,-1,0,0)
IF BytesNeeded = 0
MESSAGE('Error preparing to convert a wide string to a UTF-8 string.')
BREAK
END
lpUTF8 = CoTaskmemAlloc(BytesNeeded)
IF ~lpUTF8
MESSAGE('Out of memory allocating a UTF8 string.')
BREAK
END
IF WideCharToMultiByte(CP_UTF8,0,lpWideStr,-1,lpUTF8,BytesNeeded) = 0
MESSAGE('Wide to UTF8 conversion failed.')
BREAK
END
ReturnValue = Level:Benign
UNTIL TRUE
IF lpWideStr
CoTaskMemFree(lpWideStr)
CLEAR(lpWideStr)
END
IF lpUTF8 AND ReturnValue <> Level:Benign
CoTaskMemFree(lpUTF8)
CLEAR(lpUTF8)
END
IF ReturnValue = Level:Benign
LenghtUTF8 = lStrLen(lpUTF8)
TextUTF8 &= lpUTF8 &':'& LenghtUTF8
p_Text = TextUTF8
END
RETURN ReturnValue
Misc.FromUTF8 PROCEDURE(*STRING p_Text,BYTE p_FreeUTF8 = 0)
lpUTF8 LONG(0)
LenghtUTF8 LONG
TextCW &STRING
ReturnValue BYTE(Level:Fatal)
lpWideStr LONG(0)
WideCharNeeded LONG(0)
BytesNeeded LONG(0)
CODE
LOOP
lpUTF8 = ADDRESS(p_Text)
LenghtUTF8 = LEN(CLIP(p_Text))
IF ~lpUTF8 OR (LenghtUTF8<1 AND LenghtUTF8<>-1 )
!just return a single blank if null pointer passed
TextCW &= NEW STRING(1)
ReturnValue = Level:Benign
BREAK
END
WideCharNeeded = MultiByteToWideChar(CP_Utf8,0,lpUTF8,LenghtUTF8,0,0 )
IF WideCharNeeded = 0
MESSAGE('Error preparing to convert a UTF8 string to a wide string.')
BREAK
END
IF WideCharNeeded > 1
IF LenghtUTF8 = -1
WideCharNeeded -= 1 !get rid of the null termination here since we
want to end up with a clarion string
END
ELSE
!just return a single blank
TextCW &= NEW STRING(1)
ReturnValue = Level:Benign
BREAK
END
lpWideStr = CoTaskMemAlloc(WideCharNeeded * 2)
IF ~lpwidestr
MESSAGE('Out of memory allocating a wide string for use in converting
UTF8 to wide.')
BREAK
END
memset(lpWidestr,0,WideCharNeeded*2)
IF
MultiByteToWideChar(CP_UTF8,0,lpUTF8,CHOOSE(LenghtUTF8=-1,lStrLen(lpUTF8),LenghtUTF8),lpWideStr,WideCharNeeded
) = 0
MESSAGE('Error converting a UTF8 string to a wide string.')
BREAK
END
BytesNeeded = WideCharToMultiByte(CP_ACP,0,lpWideStr,WideCharNeeded,0,0)
IF BytesNeeded = 0
MESSAGE('Error preparing to convert a wide string to a UTF-8 string.')
BREAK
END
TextCW &= NEW STRING(CHOOSE(BytesNeeded<=0,1,BytesNeeded))
IF TextCW &= NULL
MESSAGE('Out of memory allocating a Ansi string.')
BREAK
END
IF
WideCharToMultiByte(CP_ACP,0,lpWideStr,WideCharNeeded,ADDRESS(TextCW),BytesNeeded)
= 0
MESSAGE('Wide to UTF8 conversion failed.')
BREAK
END
ReturnValue = Level:Benign
UNTIL TRUE
IF lpUTF8 AND p_FreeUTF8
CoTaskMemFree(lpUTF8)
CLEAR(lpUTF8)
END
IF lpWideStr
CoTaskMemFree(lpWideStr)
CLEAR(lpWideStr)
END
IF TextCW &= NULL
TextCW &= NEW STRING(1)
END
IF ReturnValue = Level:Benign
p_Text = TextCW
END
DISPOSE(TextCW)
RETURN ReturnValue
InitCP PROCEDURE (p_FromCP,p_ToCP,p_FromTip,p_ToTip) !
Declare Procedure
CPTip SHORT
CPString STRING(10)
CODE
IF OMITTED(3) THEN p_FromTip = 437.
IF OMITTED(4) THEN p_ToTip = 852.
LOOP X# = 1 TO 2
EXECUTE X#
CPTip = p_FromTip
CPTip = p_ToTip
END
CASE CPTip
OF 8 ! UTF8
DO Set::CPString:UTF8
OF 437
DO Set::CPString:437
OF 852
DO Set::CPString:852
OF 1250
DO Set::CPString:1250
OF 8859
DO Set::CPString:8859
ELSE
BEEP(BEEP:SystemExclamation)
MESSAGE('Nije definirano pretvaranje znakova za kodnu tabelu: '& CPTip
&'!','Nedefinirani konverter',ICON:Exclamation)
BREAK
END
EXECUTE X#
p_FromCP = CPString
p_ToCP = CPString
END
END
Set::CPString:UTF8 ROUTINE
CPString = '<0>UTF8'
Set::CPString:437 ROUTINE
! } c
CPString[1] = CHR(125)
! ] C
CPString[2] = CHR(93)
! ~ c
CPString[3] = CHR(126)
! ^ C
CPString[4] = CHR(94)
! | d
CPString[5] = CHR(124)
! \ D
CPString[6] = CHR(92)
! { s
CPString[7] = CHR(123)
! [ S
CPString[8] = CHR(91)
! ` z
CPString[9] = CHR(96)
! @ Z
CPString[10] = CHR(64)
Set::CPString:852 ROUTINE
! c c
CPString[1] = CHR(134)
! C c
CPString[2] = CHR(143)
! c c
CPString[3] = CHR(159)
! C C
CPString[4] = CHR(172)
! d d
CPString[5] = CHR(208)
! D D
CPString[6] = CHR(209)
! s s
CPString[7] = CHR(231)
! S S
CPString[8] = CHR(230)
! z z
CPString[9] = CHR(167)
! Z Z
CPString[10] = CHR(166)
Set::CPString:1250 ROUTINE
! S c
CPString[1] = CHR(230)
! A C
CPString[2] = CHR(198)
! R c
CPString[3] = CHR(232)
! L C
CPString[4] = CHR(200)
! d
CPString[5] = CHR(240)
! d D
CPString[6] = CHR(208)
! Ü s
CPString[7] = CHR(154)
! O S
CPString[8] = CHR(138)
! × z
CPString[9] = CHR(158)
! Ä Z
CPString[10] = CHR(142)
Set::CPString:8859 ROUTINE
! S c
CPString[1] = CHR(230)
! A C
CPString[2] = CHR(198)
! R c
CPString[3] = CHR(232)
! L C
CPString[4] = CHR(200)
! d
CPString[5] = CHR(240)
! d D
CPString[6] = CHR(208)
! ¦ s
CPString[7] = CHR(185)
! e S
CPString[8] = CHR(169)
! z z
CPString[9] = CHR(190)
! « Z
CPString[10] = CHR(174)
Ovo mi se cini kao odlicno rjesenje i stavio sam to u svoj program, ali ne
mogu dobiti nikakakavu promjenu, ili ne znam postaviti parametre, malo sam
se izgubio u tim parametrima, pogotovo u InitCP.
Ja zapravo hocu pretvoriti string u UTF8 i s Line print ga staviti u TXT
datoteku.
Nesto tipa:
slog = 'sdccz []{}'
InitCp(437,8,437,8)
ConvertCP(0,65001,slog)
LinePrint(slog,nazivdatoteke,0)
Da li se uopce moze sa LinePrint dobiti UTF8 ili mozda on to pretvara natrag
u Ansi ?
"Cimer" <franjo....@bezovogck.t-com.hr> wrote in message
news:io1lk0$lkl$1...@ss408.t-com.hr...
Ovako se to koristi:
DATA
FromCP STRING(10)
ToCP STRING(10)
CODE
slog = 'sdccz []{}'
InitCp(FromCP,ToCP,437,8)
ConvertCP(FromCP,ToCP,slog)
! Slog ce biti preveden u utf8 format
LinePrint(slog,nazivdatoteke,0)
!
LinePrint koji obično šalje tekst na printer ne zna što šalje.
Ako se radi o POS pisačima a ti imaš standardnu windows aplikaciju onda ide
konverzija iz 1250 u 852 ili 437.
Ako pisač nema nikakva hrvatska slova mogu ti poslati novi kod koji naša
slova pretvara u slova bez kvacica.
--
Z. <(-e)kas