7
votes

Comment écrire le fichier UTF-8 avec fprintf en C ++

Je suis la programmation (juste occulalement) en C ++ avec VisualStudio et MFC. J'écris un fichier avec fopen et fprintf. Le fichier doit être codé dans UTF8. Y a-t-il une possibilité de faire cela? Tout ce que j'essaie, le fichier est soit double octet unicode ou ISO-8859-2 (Latin2) codé.

Glanebridge


2 commentaires

Voir d'autres messages sur Unicode en C ++ Stackoverflow.com/Questions/55641/Unicode-In-c


Vous pouvez essayer de voir ce fil [Entrez la description de la liaison ici] [1] [1]: Stackoverflow.com/questions/2543346/...


3 Réponses :


1
votes

En théorie, vous devez simplement définir un paramètre local qui utilise UTF-8 comme codage externe. Ma compréhension - je ne suis pas un programmeur Windows - est-ce Windows n'a pas de local de ce type , vous devez donc recourir à la mise en œuvre des moyens spécifiques ou non Bibliothèques standard (lien du commentaire de Dave).


0 commentaires

2
votes

Oui, mais vous avez besoin de Visual Studio 2005 ou plus tard. Vous pouvez ensuite appeler fopen avec les paramètres suivants:

LPCTSTR strText = "абв";
FILE *f = fopen(pszFilePath, "w,ccs=UTF-8");
_ftprintf(f, _T("%s"),  (LPCTSTR) strText);


7 commentaires

Je ne pense pas que cela affecterait les données écrites dans le fichier à l'aide de FPRINTF.


Vous devez utiliser _ftprintf. Voir les changements dans ma réponse.


Ou simplement utiliser fwprintf. Ce qui se passe est que ccs = utf-8 définit le mode _O_U8Text dans le fichier, de sorte que l'écriture de caractères de large dans le fichier entraînera la sortie UTF-8. Écrire des caractères étroits avec cet ensemble de mode entraînera une erreur.


Voulez-vous dire que vous avez déjà un tampon avec du texte UTF-8? Dans ce cas, pourquoi non seulement ouvrir le fichier en mode binaire et écrire le tampon avec fwrite?


Non, je veux dire que puisque l'utilisation de TPRINTF ne fonctionnera que si TCHAR et toutes les fonctions T résolvent vers WCHAR_T Fonctions Pourquoi ne pas simplement utiliser les fonctions WCHAR_T directement? TCAR n'est utile que lorsqu'un programme va réellement basculer entre Char et WCHAR_T. Si vous ne voulez pas utiliser les deux, il n'y a aucune raison d'utiliser TCHAR. fichier * f = fopen (nom de fichier, "w, css = utf-8"); fwprintf (f, l "% s", l "абв");


Oups, j'avais déjà décidé que tu étais l'Op, désolé. Quant à FWPrintf, vous avez raison, il vaut mieux utiliser FWPrintf.


J'ai vérifié et ça marche vraiment! (Visual Studio 2013). Merci!



2
votes

Vous ne devriez pas avoir besoin de définir votre local ou de définir des modes spéciaux dans le fichier si vous souhaitez simplement utiliser FPRRTINF. Il vous suffit d'utiliser des chaînes codées UTF-8.

#include <fstream>
#include <codecvt>

int main() {
    if(auto f = std::wofstream("tmp")) {
        f.imbue(std::locale(std::locale(),
                new std::codecvt_utf8_utf16<wchar_t>)); // assumes wchar_t is UTF-16
        f << L"кошка 日本国\n";
    }
}


1 commentaires

@Nicolbolas Le premier exemple utilise Wstring_Convert de C ++ 11, mais toute autre méthode d'obtention d'un codage UTF-8 fonctionne également, par ex. Widechartomultibyte. Le dernier exemple utilise une facette Codecvt C ++ 11 pour laquelle il n'y a pas de remplacement intégré, pré-C ++ 11. Les deux autres exemples n'utilisent pas C ++ 11.