Bonjour, j'ai récemment recommencé à apprendre le c++ grâce au formidable cours sur ZesteDeSavoir. Je suis actuellement sur le chapitre qui concerne l'utilisation des fichiers extérieurs, et un détail me titille : lorsque l'on nous explique comment utiliser l'UTF-8 sous Windows. Je me disais au début que au final j'en avais un peu rien à faire et que l'ASCII me convenais parfaitement, j'avais juste à ne pas utiliser d'accents et autres fantaisies. Mais j'ai quand même essayé d'ouvrir un fichier texte avec de l'UTF-8, car "on sait jamais". J'ai donc tout simplement recopié le code exemple fournis dans le cours et suivis les indication d'enregistrement du code source. Mais quand je compile, une horrible erreur...
Je n'ai absolument aucune idée de où cela peut venir.
J'ai du chercher, je comprenais pas non plus d'où venait l'erreur.
Si tu compiles en utilisant le C++17 (le code a été publié en 2018), cela fonctionne correctement.
Dans le C++20, le u8 ont été changé de "const char[N]" en "const char8_t[N]" https://en.cppreference.com/w/cpp/language/string_literal. Ces char8_t ne sont pas compatible avec std::string (pour rappel, std::string est un alias du type std::basic_string<char>). Il faut utiliser std::u8string (qui est un alias du type std::basic_string<char8_t>)
Le but est de forcer à ne pas mélanger des char et des char UTF8 et éviter que de l'UTF8 soit manipulé comme de l'ASCII.
Le problème est que tous les manipulateurs de string doivent aussi utiliser char8_t, et donc tu peux pas utiliser directement std::cout ou std::ofstream. Il y a des hacks, mais c'est très moche.
Honnêtement, t’embête pas trop avec ca, le support de l'UTF8 est moisi en C++ (sans lib) et c'est une perte de temps.
Pour ceux qui voulais voir l'erreur complète, je vous la met dans le prochain message, mais je pense que gbdivers à tout de même trouvé le coeur du problème. En effet lorsque je change les "std::string" par des "std::u8string", l'erreur concernant le std::vector disparait, en revanche il est vrais que je ne peux pas inclure le texte UTF-8 dans mon fichier texte avec std::ofstream ...
C'est pas grave, je vais devoir me résoudre à ne pas utiliser d'UTF-8 et de rester sur le ASCII.
1>C:\Users\felix.cabanel\OneDrive - ESTIA\Bureau\Cours ZesteDeSavoir\TestCpp\TestCpp\main.cpp(9,5): error C2440: 'initializing': cannot convert from 'initializer list' to 'std::vector<std::string,std::allocator<std::string>>'
1>C:\Users\felix.cabanel\OneDrive - ESTIA\Bureau\Cours ZesteDeSavoir\TestCpp\TestCpp\main.cpp(9,5): message : 'std::vector<std::string,std::allocator<std::string>>::vector(std::initializer_list<_Ty>,const _Alloc &)': cannot convert argument 1 from 'initializer list' to 'std::initializer_list<_Ty>'
1> with
1> [
1> _Ty=std::string,
1> _Alloc=std::allocator<std::string>
1> ]
1> and
1> [
1> _Ty=std::string
1> ]
1>C:\Users\felix.cabanel\OneDrive - ESTIA\Bureau\Cours ZesteDeSavoir\TestCpp\TestCpp\main.cpp(9,5): message : Element '1': no conversion from 'const char8_t [25]' to '_Ty'
1> with
1> [
1> _Ty=std::string
1> ]
1>C:\Users\felix.cabanel\OneDrive - ESTIA\Bureau\Cours ZesteDeSavoir\TestCpp\TestCpp\main.cpp(9,5): message : Element '2': no conversion from 'const char8_t [44]' to '_Ty'
1> with
1> [
1> _Ty=std::string
1> ]
1>C:\Users\felix.cabanel\OneDrive - ESTIA\Bureau\Cours ZesteDeSavoir\TestCpp\TestCpp\main.cpp(9,5): message : Element '3': no conversion from 'const char8_t [30]' to '_Ty'
1> with
1> [
1> _Ty=std::string
1> ]
1>C:\Users\felix.cabanel\OneDrive - ESTIA\Bureau\Cours ZesteDeSavoir\TestCpp\TestCpp\main.cpp(9,5): message : Element '4': no conversion from 'const char8_t [29]' to '_Ty'
1> with
1> [
1> _Ty=std::string
1> ]
1>C:\Users\felix.cabanel\OneDrive - ESTIA\Bureau\Cours ZesteDeSavoir\TestCpp\TestCpp\main.cpp(9,5): message : while trying to match the argument list '(initializer list)'
1>Done building project "TestCpp.vcxproj" -- FAILED.
C'est pas vraiment de l'ASCII, dans la console windows c'est une extension 8 bits de l'ASCII qui n'en comporte que 7.
Définie par un "code page", genre 850 OEM Multilingue Latin 1 ; Europe occidentale (DOS), qui va donner la correspondance entre les codes 8 bits et les petits gribouillis à afficher (en passant par leur expression graphique par une police)
son usage historique des jeux de caractères 8 bits hérités de DOS (qui lui même les tenait d'IBM)
son idée géniale de prétendre faire de l'Unicode sur des "caractères larges" 16 bits (UCS-2, windows 95 et NT 3.1, abandonné depuis), puis UTF-16 (1 ou 2 mots de 16 bits, windows 2000). Autant dire la compatibilité avec le reste du monde (UTF-8) ça traîne des pieds.
----
Les spécialistes de C++ ont oublié une piste simple : surcharger << pour afficher les u8string
Discord NaN. Mon site.
Discord NaN. Mon site.