XML::Simple && encoding problem
Pavel Nejedly
bim na atrey.karlin.mff.cuni.cz
Středa Říjen 18 20:37:17 MEST 2000
On Wed, Oct 18, 2000 at 06:16:51PM +0200, Dominik Kollar wrote:
# mam problem potrebuji parsovat XML dokument z ISO-8859-2 => win1250 :-(( a
# dale je zpracovavat :-)) ale uz kdyz nactu dokument pomoci XMLin tak se
# cestina rozhasi ...
To ma na svedomi XML::Parser, ktery konverti vstup. kodovani na UTF-8.
Bohuzel Cstools konverzi UTF-8 -> Win nepodporuje (teda aspon pokud vim),
takze nejlepsi bude, kdyz vystup Vaseho skriptu prozenete nejakym
konvertorem - pokud zadnuy nemate, tak si muzete upravit UTF-8 parser
v priloze - konkretne funkci UTF32Flush - chce to jenom najit cisla ceskych
znaku v Unicode databazi, akorat zrovna nemam cas :(
No, jestli to pocka do zitrka, tak to bude umet i tu konverzi -> Win :)
Pavel
------------- další část ---------------
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#define U8 unsigned char
#define U32 unsigned long
#define MAXBUF (512*1024)
int UTF8Len[64] =
{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* chyba */
2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 5, 6};
int UTF8FirstMask[7]=
{0x00, 0x7F, 0x1F, 0x0F, 0x07, 0x03, 0x01}; /* maska 1. byte */
U8 buf1[MAXBUF+10];
U8 *buf1p=buf1,*buf1e=buf1;
U32 buf2[MAXBUF+10];
U32 *buf2p=buf2,*buf2e=buf2+MAXBUF;
void UTF32Flush(U32 *data, int count)
{
static U8 outbuf[MAXBUF+10];
U32 *p=data, *e=data+count;
U8 *q=outbuf;
for(;p<e; *q++ = *p++ );
write(1,outbuf,count);
}
int main(int argc,char **argv)
{
int ifd=0;
int l,lres;
U8 c;
U32 C;
while(1)
{
l=buf1p-buf1e;
memmove(buf1,buf1p,l);
buf1p=buf1;buf1e-=l;
if((l=read(ifd,buf1e,MAXBUF-l))<0)
perror("");
if(!l) break;
buf1e+=l;
while((lres=buf1e-buf1p))
{
c=*buf1p++;
l=UTF8Len[ (c >> 2) & 0x3F ] ;
if(!l)
continue; /* chyba, preskoc znak */
if(l>lres)
break; /* nacti zbytek znaku */
C= c & UTF8FirstMask[l]; /*prvni znak je spec. pripad*/
while(--l)
C= ( C<<6 ) | ( (*buf1p++) & 0x3F );
*buf2p++=C;
if(buf2p>buf2e)
{
UTF32Flush(buf2,buf2p-buf2);
buf2p=buf2;
}
}
}
UTF32Flush(buf2,buf2p-buf2);
return 0;
}
Další informace o konferenci Perl