Créer un fichier UTF-8 dans Qt

j'essaie de créer un fichier codé UTF-8 dans Qt.

#include <QtCore>

int main()
{
    QString unicodeString = "Some Unicode string";
    QFile fileOut("D:Tempqt_unicode.txt");
    if (!fileOut.open(QIODevice::WriteOnly | QIODevice::Text))
    {
        return -1;
    }

    QTextStream streamFileOut(&fileOut);
    streamFileOut.setCodec("UTF-8");
    streamFileOut << unicodeString;
    streamFileOut.flush();

    fileOut.close();

    return 0;
}

J'ai pensé que lorsque QString est par défaut Unicode et que j'ai défini le codec du flux de sortie à UTF-8, mon fichier sera UTF-8. Mais il ne l'est pas, c'est ANSI. Que dois-je faire de mal? Quelque chose ne va pas avec mes ficelles? Pouvez-vous corriger mon code pour créer un fichier UTF-8? La prochaine étape pour moi sera de lire le fichier ANSI et de l'enregistrer en tant que Fichier UTF-8, donc je vais devoir effectuer une conversion sur chaque chaîne de lecture, mais maintenant, je veux commencer par un fichier. Remercier.

18
demandé sur Martin Hennings 2011-01-24 12:39:57

3 réponses

votre code est absolument correct. La seule partie qui vous semble suspect pour moi, c'est ceci:

QString unicodeString = "Some Unicode string";

vous réalisez que vous ne pouvez pas simplement mettre une chaîne Unicode entre guillemets, n'est-ce pas? Par défaut, QString utilise Latin1, donc s'il ne s'agit que de caractères accentués, vous êtes probablement très bien, mais mieux vaut avoir votre source encodée dans UTF-8 et faire ceci:

QString unicodeString = QString::fromUtf8("Some Unicode string");

cela fonctionnera pour n'importe quel langage imaginable. Utiliser QObject:: trUtf8() est encore mieux car il vous donne beaucoup de i18n capacité.

Modifier

bien qu'il soit vrai que vous générez un fichier UTF-8 correct, si vous voulez que Notepad reconnaisse votre fichier comme UTF-8, c'est une autre histoire. Tu dois mettre un BOM là-dedans. Cela peut être fait comme suggéré dans une autre réponse, ou Voici une autre façon:

streamFileOut.setGenerateByteOrderMark(true);
16
répondu Sergei Tachenov 2011-01-24 15:08:33

Mon expérience pour créer txt encodage UTF-8 sans BOM par QT:

file.open(QIODevice::WriteOnly | QIODevice::Text);
QTextStream out(&file);
out.setCodec("UTF-8"); // ...
vcfline = ctn; //assign some utf-8 characters
out.setGenerateByteOrderMark(false);
out << vcfline; //.....
file.close();

et le fichier codera UTF-8 sans BOM.

7
répondu user2006121 2013-01-24 03:55:00

N'oubliez pas que UTF-8 encoding encodera les caractères ASCII comme un octet. Seuls les caractères spéciaux ou accentués seront encodés avec plus d'octets (de 2 à 6 octets).

cela signifie aussi longtemps que vous avez des caractères ASCII (ce qui est le cas de votre unicodeString), le fichier ne contiendra que 8 octets de caractères. Ainsi, vous obtenez la compatibilité ascendante avec ASCII:

UTF-8 peut représenter tous les caractères dans le jeu de caractères Unicode, mais contrairement ils possèdent les avantages d'être rétrocompatibles avec les ASCII!--5-->

Pour vérifier si votre code fonctionne, vous devez, par exemple, certains caractères accentués dans votre unicode.

j'ai testé votre code avec des caractères accentués, et ça marche très bien.

Si vous voulez avoir un BOM au début de votre fichier, vous pouvez commencer par ajouter le caractère BOM (QChar(QChar::ByteOrderMark)).

5
répondu Jérôme 2013-10-18 09:39:00