La solution parfaite au problème des caractères chinois tronqués dans Qt 5

Présentation du problème de code tronqué

Lors de l'utilisation de Qt, nous rencontrons souvent des problèmes avec des caractères chinois tronqués, des journaux d'impression qDebug tronqués ou des interfaces de widget tronquées, etc.

La raison est principalement due au problème d'utilisation du compilateur MSVC, et le MinGW fourni avec Qt n'a généralement pas de problèmes de code tronqué.

La raison principale est le problème d'encodage, c'est-à-dire l'éternel problème difficile de l'encodage UTF-8 et GBK.

Problème lors de l'utilisation du compilateur MSVC pour afficher le chinois

Lorsque vous utilisez le compilateur MSVC pour compiler un projet dans Qt Creator, des chaînes chinoises tronquées peuvent facilement apparaître si elles ne sont pas gérées correctement.
Par exemple, lorsque le programme est en cours d'exécution, les caractères chinois affichés par LabInfo seront tronqués.

void MainWindow::Changed()
{
	QString str="测试";
	ui->LabInfo->setText(str);
} 

En effet, les fichiers enregistrés par Qt Creator utilisent le codage UTF-8 (un jeu de caractères multiplateforme qui peut être utilisé sur n'importe quelle plate-forme et dans n'importe quel langage). Bien que le compilateur MSVC puisse normalement compiler des fichiers sources codés en UTF-8 avec BOM , mais le codage du fichier exécutable généré est le jeu de caractères local Windows, tel que GBK2312.

C'est-à-dire que dans le fichier exécutable, la chaîne “测试”est codée en GBK2312 , mais lorsque le programme exécutable exécute cette instruction, la chaîne est décodée en UTF-8 , ce qui provoquera des caractères tronqués.

solution

Environnement Qt pur

Il existe deux façons de résoudre ce problème

Une méthode consiste à utiliser QStringLiteral()des macros ou QString::fromLocal8Bit()des chaînes encapsulées, et l'autre méthode consiste à forcer le fichier exécutable généré par le compilateur MSVC à utiliser le codage UTF-8.

1. Option 1

La macro QStringLiteral(str)génère des données de chaîne à partir d'une chaîne str lors de la compilation et les stocke dans le segment de données en lecture seule du fichier compilé. Lorsque le programme utilise cette chaîne lors de son exécution, il lui suffit de lire les données de la chaîne. Peut.

Par conséquent, la macro QStringLiteral() doit être utilisée dans le programme pour encapsuler chaque chaîne chinoise . Le code peut être modifié comme suit :

QString str = QStringLiteral("测试");

défaut:

Chaque chaîne contenant du chinois doit être encapsulée et la fonction tr() ne peut pas être utilisée (elle peut être ignorée sans exigences de traduction internationale)

Option II

Pour forcer le compilateur MSVC à utiliser le codage UTF-8 pour générer des fichiers exécutables, vous devez ajouter l'instruction suivante devant chaque fichier d'en-tête et fichier de programme source qui utilise des chaînes chinoises :

#if _MSC_VER >= 1600 //VS2015>VS>VS2010, MSVC VER= 10.0 -14.0
#pragma execution_character_set("utf-8")
#endif

Le compilateur de VS 2010-VS 2015 Update2 peut utiliser ce schéma, qui force le fichier exécutable compilé à être codé en UTF-8. De cette façon, même si la macro QStringLiteral() n'est plus utilisée, le problème des caractères chinois tronqués ne se produira plus lors de l'exécution du programme. De plus, vous pouvez également utiliser la fonction tr() pour traduire des chaînes.

Personnellement, je pense que la meilleure solution est :

Ajouter au fichier pro

msvc{
    QMAKE_CFLAGS += /utf-8
    QMAKE_CXXFLAGS += /utf-8
}

ou

msvc{
    QMAKE_CXXFLAGS += /source-charset:utf-8 /execution-charset:utf-8
}

exécution-charest représente le jeu de caractères d'exécution. source-charset représente le jeu de caractères du code source.
Les deux méthodes sont disponibles.

Remarque :msvc Il doit être en minuscules. Pour les tests personnels, les lettres majuscules MSVCne sont pas valides . De plus, avant de l'exécuter, il est recommandé de l'effacer, de le reconstruire et de supprimer le cache précédent.

Résolution des problèmes d'encodage de l'environnement VS + Qt

De manière générale, il n'y aura pas de caractères tronqués car le texte et le compilateur sont tous codés en GBK. Mais pour une meilleure compatibilité multiplateforme, si vous passez au codage UTF-8, vous devez apporter quelques modifications.

  1. Tout d'abord, vous devez définir le texte au format UTF-8
    , qui ne sera pas présenté ici. Pour des solutions spécifiques, veuillez vous référer à Problèmes d'encodage VS2019, Comment passer parfaitement à UTF-8.
  2. Ajoutez-le sous Propriétés du projet-Ligne de commande C/C++-Autres options/utf-8

Le test a révélé qu'en utilisant VS2019, la macro _MSC_VER de la solution Qt pure 2 peut également résoudre le problème tronqué.

Lien de référence

/utf-8

exécution_character_set

Je suppose que tu aimes

Origine blog.csdn.net/no_say_you_know/article/details/121694766
conseillé
Classement