-1
votes

La chaîne C ++ à Wstring imprime de manière incorrecte, impossible d'obtenir un chemin unicode

 C:\Users\luka\Desktop\ⁿ?icΣ\unicode.exe
 C:\Users\luka\Desktop\ⁿ?icΣ\unicode.exe
 C:\Users\luka\Desktop\ⁿ

7 commentaires

Écrivez-vous dans un fichier ou à un terminal?


cmd, mais quand i CD dans le dossier, il est affiché correctement afin que cela ne soit pas un problème, sauf si cela ne montre que C ++ Unicode de manière incorrecte.


Tho quand je fais STD :: wcout << l "üлicä" << std :: endl; Il affiche ⁿ, et quand j'ajoute du texte, par exemple L "Areüлicä", il s'affiche


Windows ne prend pas en charge UF-8 dans argv , donc prenant un élément argv et prétendant faire semblant une chaîne UTF-8 ne fonctionnera tout simplement pas. Si vous programmez pour Windows, votre meilleur pari est probablement d'utiliser Wmain et wchar_t ** argv .


Wmain se traduit par une référence non définie à WinMain


C: / MINGW / MINGW64 / BIN /../ LIB / GCC / X86_64-W64-MINGW32 / 8.1.0 /../ .//../../x86_64-w64- MINGW32 / LIB / ../lib\l ibmingw32.a (lib64_li bingw32_a-crt0_c.o): crt0_c.c.c :(. Text.sta RTUP + 0X2E): Référence non définie à `Winmain 'Collect2.exe: Erreur: LD Retourné 1 statut de sortie


Si vous utilisez un compilateur Microsoft, utilisez wmain selon la documentation de Mucrosoft. Il n'est pas aussi simple que le remplacement de principal , vous devez également modifier vos paramètres de projet. Je ne sais pas comment MINGW aboutit à ce problème, vous souhaitez probablement consulter la documentation MINGW. Google pour "Mingw Unicode" ou quelque chose. Vous trouverez peut-être quelque chose comme Ceci ou peut-être autre chose.


4 Réponses :


0
votes

Ceci est probablement associé à ce que le programme, mais la console, je vous suggère d'essayer de sortir dans un fichier et de vérifier si le codage est correct.

Vous pouvez le faire en utilisant freopen :

int main (int argc, char * argv []) { freopen ("sortie-fichier-name.txt", "w", stdout); / * reste de code * / }

Si le problème persiste, essayez d'utiliser Visual Studio avec _SetMode (..., _o_u16text) juste avant d'utiliser wcout comme décrit ici: Httpts://stackoverflow.com/a/9051543/9541897


7 commentaires

Comment utiliser freopen ("sortie-fichier-name-nom.txt", "w", stdout); ? Est-il censé imprimer toutes les coutures précédentes ou je le transmettes-je un wstring quelque part? Et ai-je besoin de le fermer?


Il suffit de l'ajouter juste en dessous de int Main () {. Int Main () {Freopen ("Out.Txt", "W", stdout); / * reste du code * /}


Le fichier est vide. Voici le code: `` int Main (int Argc, char * argv []) {std :: wcout << l "anglais - ελληνικά - español." << STD :: endl; freopen ("sortie-fichier-name.txt", "w", stdout); std :: wcout << l "areüлicä" << std :: endl; } ``


Je sais que cela sonne bizarre mais quand j'ai commenté le premier wcout ligne et supprimé le l il vient de fonctionner parfaitement !! Essayez d'utiliser ce code: int Main (int Argc, char * argv []) {Freopen ("Sortie-File-Name.txt", "W", stdout); std :: wcout << "üлicä areüлicä" << std :: endl; }


Qui sauve réellement bien alors peut-être qu'il y a de l'espoir


WCHAR_T FileName [max_path]; GetModulefilenamew (null, nom de fichier, max_path); std :: wcout << nom de fichier << std :: endl; sauve toujours juste le premier tho


Cela nous laisse avec deux scénarios possibles, soit nom de fichier contient déjà un format non valide, soit le format correct mais wcout traite de la mauvaise manière. Veuillez vérifier à l'aide de Visual Studio et _SetMode (..., _O_U16Text) DROITE AVANT D'UTILISER WCOUT , cela vérifierait si wcout est défectueux



1
votes

L'utilisation du getmodulefilename est correcte. Vous devriez voir le résultat attendu avec MessageBoxw (0, nom de fichier, 0, 0);

Le problème est dans l'impression L "¼ð" icä " sur la console de fenêtre .

Essayez l'impression "¼ð" icä " sur la console: xxx

dans Visual Studio Vous pouvez également utiliser < a href = "https://stackoverflow.com/questions/2492077/Output-unicode-strings-in-windows-console-app/9051543#9051543"> _SetMode pour activer l'utilisation de std :: wcout / std :: wcin

Vous avez également un point d'entrée facultatif wmain (int argc, wchar_t * argv []) qui fournit argv dans l'encodage UTF16.

Le point d'entrée principale fournit argv dans l'encodage ANSI (pas de codage UTF8). ANSI peut perdre des informations, contrairement à Unicode.


0 commentaires

0
votes

Voici un exemple qui fonctionne avec Windows. Vous devrez trouver les paramètres de compilateur / lieur droit pour prendre en charge Wmain sur Mingw, mais cela fonctionnera. _SetMode permet d'écrire unicode directement sur le terminal et doit fonctionner aussi longtemps que la police prend en charge les caractères. Dans mon exemple, j'utilise certains chinois, que ma police prend en charge: xxx

sortie: xxx


0 commentaires

0
votes

Pourquoi êtes-vous Typefing lpwstr et pwstr manuellement? windows.h traite déjà cela pour vous.

Dans tous les cas, comme @ n.m. dit dans les commentaires, les arguments de principal () ne sont pas codés dans UTF-8 sous Windows, afin de convertir des caractères non-ASCII à l'aide d'un convertisseur UTF8-> UTF16 ne produira pas la sortie correcte. Utilisez le win32 MultiByteTowidechar () < / Code> fonction à la place pour convertir les arguments, à l'aide de cp_acp comme code de code à convertir de. Ou, utilisez wmain () à la place, qui fournit des arguments comme wchar_t * au lieu de char * . .

Cela vous obtiendra les données que vous voulez. Ensuite, il vous suffit de faire face à la question de la sortie Unicode à la console. Comme d'autres réponses signalent, la console Windows ne prend pas en charge la sortie UTF-16 via std :: wcout Par défaut, vous devez donc sauter à travers des cerceaux supplémentaires pour que cela fonctionne correctement (il y a beaucoup d'autres Questions sur Stackoverflow à propos de cette question).


0 commentaires