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