2017-05-11 2 views
3

J'essaye de lire un fichier qui peut avoir n'importe quel charset/codePage, mais je ne sais pas quel paramètre régional pour définir correctement le fichier. Voici mon extrait de code dans lequel j'essaie de lire un fichier ayant le jeu de caractères sous windows-1256, mais je veux obtenir le jeu de caractères dynamiquement à partir du fichier en cours de lecture afin de pouvoir définir les paramètres régionaux en conséquence.Détecter le jeu de caractères du fichier dynamiquement en C++

std::wifstream input{ filename.c_str() }; 
std::wstring content{ std::istreambuf_iterator<wchar_t>(input1), std::istreambuf_iterator<wchar_t>() }; 
input.imbue(std::locale(".1256")); 
contents = ws2s(content); // Convert wstring to CString 

Répondre

2

En général, il est impossible d'utiliser avec précision le contenu d'un fichier texte brut seul. Habituellement, vous devriez compter sur des informations externes. Par exemple, si le fichier a été téléchargé avec HTTP, le codage doit être reçu dans un en-tête de réponse.

Certains fichiers peuvent contenir des informations sur le codage spécifiées par le format de fichier. XML par exemple: <?xml version="1.0" encoding="XXX"?>.

Des encodages Unicode peuvent être détectés si le fichier commence par un repère d'ordre d'octet - facultatif.

Vous pouvez généralement supposer que le codage utilise un caractère large si le fichier contient un octet zéro - ce qui représenterait le caractère de fin de chaîne comme un caractère étroit - avant la fin du fichier. De même, si vous trouvez deux zéros consécutifs alignés sur une limite de 2 octets (avant la fin), le codage est probablement de 4 octets. A part ça, vous pouvez essayer de deviner l'encodage basé sur la fréquence de certains caractères. Cela peut avoir quelques unintended consequences.

+0

Il n'y a pas de méthode complète pour déterminer le jeu de caractères, mais nous pouvons utiliser la bibliothèque ICU pour cela, ce qui donne une solution basée sur l'heuristique. J'ai utilisé un extrait de https://github.com/mooz/node-icu-charset-detector/blob/master/node-icu-charset-detector.cpp –

+0

@SaurabhKathpalia ouais, externaliser à une bibliothèque est un excellent moyen de Gagnez du temps et des efforts. Gardez juste à l'esprit les pièges potentiels de l'approche basée sur l'heuristique (le dernier lien de ma réponse est un exemple pratique d'un tel piège). – user2079303

1

Laissez-moi être franc et dire: vous ne pouvez pas

Permettez-moi de nuancer: un fichier est tout simplement des tonnes de 0 et de 1 collé sur votre disque. Un jeu de caractères est un moyen d'interpréter ces 0 et 1. Vous devez fournir les informations sur la façon de les interpréter, à savoir, en spécifiant un charset.

Une manière typique de le faire consiste à écrire un en-tête pour spécifier le charset.

C'est un en-tête html

<head> 
    <title>Page Title</title> 
    <meta charset="UTF-8"> 
</head> 

Comme vous pouvez le voir, le jeu de caractères doit être spécifié d'une manière ou d'une autre.

De temps en temps, vous voyez une application malveillante devinant un jeu de caractères, ils le font souvent avec des heuristiques sur la distribution des octets, mais ce n'est pas fiable et cela donne souvent du charabia.

En note, essayez UTF-8 everywhere, les autres sont, pour le dire légèrement, en désordre.