PDA

View Full Version : [C++] charset...


homer87
24-09-2008, 22:30
Non mi sono posto mai questo problema, ma volendo manipolare un file di testo in UTF è possibile farlo con la STL?? Oppure mi devo rivolgere ad una libreria esterna???

Vincenzo1968
25-09-2008, 13:10
Ciao homer,

puoi appoggiarti a delle ottime librerie esterne:
http://utfcpp.sourceforge.net/
http://code.msdn.microsoft.com/UTF8Helpers

In alternativa, puoi scaricarti le specifiche:

http://www.unicode.org/
http://en.wikipedia.org/wiki/UTF-8

e implementare a mano le funzioni per gestire i vari formati.
Il codice seguente(in C), per esempio, legge un file di testo e restituisce il formato:


#include <stdio.h>

#define TF_ANSI 1
#define TF_UTF16LE 2 // UTF16 Little Endian
#define TF_UTF16BE 3 // UTF16 Big Endian
#define TF_UTF8 4

int LeggiTipoFile(const char *szFileName)
{
FILE * fp;
unsigned char byte1, byte2, byte3;
int numread;

fp = fopen(szFileName, "rb");
if ( fp == NULL )
return -1;

numread = fread(&byte1, 1, 1, fp);
if ( !numread ) // file vuoto;
{
fclose(fp);
return 0;
}

if ( byte1 == 0xFF ) // UTF16LE?
{
numread = fread(&byte2, 1, 1, fp);
if ( !numread )
{
fclose(fp);
return 0;
}
if ( byte2 == 0xFE )
{
fclose(fp);
return TF_UTF16LE;
}
else
{
fclose(fp);
return TF_ANSI;
}
}

if (byte1 == 0xFE) // UTF16BE?
{
numread = fread(&byte2, 1, 1, fp);
if ( !numread )
{
fclose(fp);
return 0;
}
if ( byte2 == 0xFF )
{
fclose(fp);
return TF_UTF16BE;
}
}

if (byte1 == 0xEF) // UTF8?
{
numread = fread(&byte2, 1, 1, fp);
if ( !numread )
{
fclose(fp);
return 0;
}
if ( byte2 == 0xBB )
{
numread = fread(&byte3, 1, 1, fp);
if ( !numread )
{
fclose(fp);
return 0;
}
if ( byte3 == 0xBF)
{
fclose(fp);
return TF_UTF8;
}
}
}

fclose(fp);

return TF_ANSI;
}

int main()
{
int typeFile;

printf("\n");

typeFile = LeggiTipoFile("c:\\temp\\prova.txt");
switch( typeFile )
{
case TF_ANSI:
printf("Il file e' ANSI\n\n");
break;
case TF_UTF16LE:
printf("Il file e' TF_UTF16LE\n\n");
break;
case TF_UTF16BE:
printf("Il file e' TF_UTF16BE\n\n");
break;
case TF_UTF8:
printf("Il file e' TF_UTF8\n\n");
break;
default:
printf("Errore!!!\n\n");
break;
}

return 0;
}

cionci
25-09-2008, 19:26
Se non sbaglio le librerie boost, che presto verranno integrate nello standard, hanno il supporto a unicode ed ai vari charset.