Google grupe više ne podržavaju nove postove ni pretplate na Usenetu. Stari sadržaj ostaje vidljiv.

ANSI to UTF-8

380 prikaza
Preskoči na prvu nepročitanu poruku

Goran Markovic

nepročitano,
21. velj 2011. 06:24:2221. 02. 2011.
u
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

Zeljko Manjkas

nepročitano,
23. velj 2011. 04:05:2823. 02. 2011.
u

"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)

Cimer

nepročitano,
12. tra 2011. 09:54:5612. 04. 2011.
u

"Zeljko Manjkas" <Zeljko.Manjkas@ hardjura . hr> wrote in message
news:ik2iku$pip$1...@ss408.t-com.hr...

>
>
> "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
>
>

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 ?

Zeljko Manjkas

nepročitano,
18. tra 2011. 07:53:1818. 04. 2011.
u

"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

0 novih poruka