Est-il bon/sûr/possible d'utiliser la petite bibliothèque utfcpp pour convertir tout ce que je récupère de l'API Windows (FindFirstFileW et autres) en une représentation UTF8 valide en utilisant utf16to8?utfcpp et Win32 large API
Je voudrais utiliser l'UTF8 en interne, mais j'ai du mal à obtenir la bonne sortie (via wcout après une autre conversion ou un simple cout). Les caractères ASCII normaux fonctionnent bien sûr, mais ñä se fane.
Ou est-il une alternative plus facile?
Merci! MISE À JOUR: Merci à Hans (ci-dessous), j'ai maintenant une conversion UTF8 facile UTF8 < -> UTF16 via l'API Windows. La conversion bidirectionnelle fonctionne, mais la chaîne UTF8 de UTF16 a quelques caractères supplémentaires qui pourraient me causer quelques problèmes plus tard ...). Je vais partager ici par pure convivialité :)):
// UTF16 -> UTF8 conversion
std::string toUTF8(const std::wstring &input)
{
// get length
int length = WideCharToMultiByte(CP_UTF8, NULL,
input.c_str(), input.size(),
NULL, 0,
NULL, NULL);
if(!(length > 0))
return std::string();
else
{
std::string result;
result.resize(length);
if(WideCharToMultiByte(CP_UTF8, NULL,
input.c_str(), input.size(),
&result[0], result.size(),
NULL, NULL) > 0)
return result;
else
throw std::runtime_error("Failure to execute toUTF8: conversion failed.");
}
}
// UTF8 -> UTF16 conversion
std::wstring toUTF16(const std::string &input)
{
// get length
int length = MultiByteToWideChar(CP_UTF8, NULL,
input.c_str(), input.size(),
NULL, 0);
if(!(length > 0))
return std::wstring();
else
{
std::wstring result;
result.resize(length);
if(MultiByteToWideChar(CP_UTF8, NULL,
input.c_str(), input.size(),
&result[0], result.size()) > 0)
return result;
else
throw std::runtime_error("Failure to execute toUTF16: conversion failed.");
}
}
Juste pour clarifier: une police (au moins une police TT) vous permet de spécifier quel glyphe sera affiché pour un codepoint pour lequel la police ne contient pas de glyphe. C'est * généralement * un rectangle vide, mais pourrait être essentiellement tout ce que le concepteur de police a choisi. –
Je pensais que ceux-ci étaient disponibles, mais je ne savais pas qu'ils étaient pour la conversion UTF-8 -> UTF-16 (je pensais bêtement qu'ils utilisaient l'encodage UCS-2 à la place). La sortie de console est en effet une chose en désordre. Peut-être que je peux sortir l'UTF-8 dans un fichier et l'ouvrir avec, disons Notepad ++ (c'est seulement pour vérifier ce que fait mon programme)? – rubenvb
Bien sûr, devrait fonctionner. Tant que vous pouvez le convaincre qu'il s'agit d'un fichier UTF-8, il nécessite normalement une nomenclature au début du fichier. Ecrivez 0xef 0xbb 0xbf d'abord pour être sûr. –