2010-10-11 24 views
2

Quelqu'un peut-il fournir un exemple simple pour lire et écrire dans le fichier Unicode un caractère Unicode?Écriture et lecture de fichiers Unicode en C++?

+4

Quel format? UTF-8, UTF-16 ou UTF-32? –

+2

Et si UTF-16, lequel des 3 formats UTF-16 possibles? Big-endian, little-endian, ou spécifié par BOM? –

+1

Et, sur quelle plateforme? La taille de 'wchar_t' n'est pas partout la même: sous Windows, vous stockez généralement des chaînes en interne sous UTF-16 LE, tandis que sous Linux en UTF-8 (avec' char') ou UTF-32 ('wchar_t'). –

Répondre

1

Sur linux j'utilise la bibliothèque iconv (link) qui est très standard. Un programme trop simple est:

#include <stdio.h> 
#include <stdlib.h> 
#include <iconv.h> 

#define BUF_SZ 1024 
int main(int argc, char* argv[]) 
{ 
    char bin[BUF_SZ]; 
    char bout[BUF_SZ]; 
    char* inp; 
    char* outp; 
    ssize_t bytes_in; 
    size_t bytes_out; 
    size_t conv_res; 
    if(argc != 3) 
    { 
     fprintf(stderr, "usage: convert from to\n"); 
     return 1; 
    } 
    iconv_t conv = iconv_open(argv[2], argv[1]); 
    if(conv == (iconv_t)(-1)) 
    { 
     fprintf(stderr, "Cannot conver from %s to %s\n", argv[1], argv[2]); 
     return 1; 
    } 

    bytes_in = read(0, bin, BUF_SZ); 
    { 
     bytes_out = BUF_SZ; 
     inp = bin; 
     outp = bout; 
     conv_res = iconv(conv, &inp, &bytes_in, &outp, &bytes_out); 
     if(conv_res >= 0) 
     { 
      write(1, bout, (size_t)(BUF_SZ) - bytes_out); 
     } 
    } 
    iconv_close(conv); 
    return 0; 
} 

Ceci est trop simple pour démontrer la conversion. Dans le monde réel que vous auriez normalement deux boucles imbriquées:

  • Une entrée de lecture, donc à manipuler lorsque son plus BUF_SZ
  • Une conversion entrée à la sortie. Rappelez-vous que si vous convertissez des fichiers ascii en UTF-32LE, chaque octet de sortie sera égal à 4 octets de sortie. Ainsi, la boucle interne traiterait cela en examinant conv_res puis en vérifiant errno.