2016-11-12 1 views
2

Comment puis-je utiliser des langues (comme l'arabe ou le chinois) dans un QString?Comment puis-je utiliser des langues (comme l'arabe ou le chinois) dans un QString?

Je crée un QString:

QString m = "سلام علیکم"; 

puis je gardais dans un fichier en utilisant:

void stWrite(QString Filename,QString stringtext){ 
    QFile mFile(Filename); 

    if(!mFile.open(QIODevice::WriteOnly | QIODevice::Append |QIODevice::Text)) 
    { 
     QMessageBox message_file_Write; 
     message_file_Write.warning(0,"Open Error" 
            ,"could not to open file for Writing"); 
     return; 
    } 
    QTextStream out(&mFile); 
    out << stringtext<<endl; 
    out.setCodec("UTF-8"); 

    mFile.flush(); 
    mFile.close(); 
} 

Mais, quand j'ouvre le fichier résultat que je vois:

???? ???? 

Qu'est-ce qui ne va pas? Comment puis-je enregistrer mes personnages correctement dans le fichier?

+0

Vous avez besoin d'Unicode et UTF-8 ou UTF-16 – duffymo

+0

utiliser unicode parce que d'autres lang uage comme arabe et chinois, l'alphabet japonais prend plus d'un octet pour un seul char – Raindrop7

+0

NON ... je le fais mais ne fonctionne pas .... – Qasim

Répondre

1

QString a le support d'unicode. Donc, il n'y a rien de mal à avoir *:

QString m = "سلام علیکم"; 

La plupart des compilateurs modernes utilisent UTF-8 pour coder cette chaîne littérale ordinaire (Vous pouvez appliquer cela en 11 C++ en utilisant u8"سلام عليكم", voir here). Le littéral de chaîne a le type d'un tableau de char s. Quand QStringis initialized from a const char*, il s'attend à ce que les données soient codées en UTF-8. Et tout fonctionne comme prévu.

Tous les contrôles de saisie et les méthodes de dessin de texte dans Qt peuvent prendre une telle chaîne et l'afficher sans aucun problème. Voir here pour une liste des langues prises en charge. En ce qui concerne le problème que vous avez écrire cette chaîne dans un fichier, vous avez juste besoin de définir le codage des données que vous écrivez à un codec qui peut encoder ces caractères internationaux (tels que UTF-8).

De l'docs, Lorsque vous utilisez QTextStream::operator<<(const QString& string), la chaîne est codée en utilisant le codec attribué avant qu'il ne soit écrit dans le flux.

Le problème que vous avez est que vous utilisez le operator<< avant l'affectation. Vous devez setCodecavant d'écrire. votre code devrait ressembler à ceci:

void stWrite(QString Filename,QString stringtext){ 
    QFile mFile(Filename); 

    if(!mFile.open(QIODevice::WriteOnly | QIODevice::Append |QIODevice::Text)) 
    { 
     QMessageBox message_file_Write; 
     message_file_Write.warning(0,"Open Error" 
            ,"could not to open file for Writing"); 
     return; 
    } 
    QTextStream out(&mFile); 
    out.setCodec("UTF-8"); 
    out << stringtext << endl; 

    mFile.flush(); 
    mFile.close(); 
} 

* Dans translation phase 1, tout caractère de fichier source dans le caractère de base institué est remplacé par le universel caractères nom qui désigne la caractère, le caractère fondamental défini est défini comme suit:

N4140 §2.3 [lex.charset]/1

Le jeu de caractères de la source de base est constitué de 96 caractères: l'espace caractères, les caractères de commande représentant tabulation horizontale, tabulation verticale, saut de page, et de nouvelle ligne, ainsi que les 91 caractères graphiques suivantes:

b c

ABCDEFGHIJKLMNOPQRSTU VWXYZ

_ {} [] #() <>%:; . ? * + -/^ & | ~! =, \ " '

Cela signifie qu'une chaîne comme:

QString m = "سلام عليكم"; 

sera traduit à quelque chose comme:

QString m = "\u0633\u0644\u0627\u0645\u0020\u0639\u0644\u064a\u0643\u0645"; 

En supposant que le fichier source est codé dans un codage prend en charge le stockage de tels caractères tels que UTF-8