Non è necessario impostare le impostazioni internazionali o impostare le modalità speciali sul file se si desidera utilizzare fprintf. Devi semplicemente usare le stringhe codificate UTF-8.
#include <cstdio>
#include <codecvt>
int main() {
std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>,wchar_t> convert;
std::string utf8_string = convert.to_bytes(L"кошка 日本国");
if(FILE *f = fopen("tmp","w"))
fprintf(f,"%s\n",utf8_string.c_str());
}
Salvare il programma come UTF-8 con la firma o UTF-16 (vale a dire non usano UTF-8 senza la firma, altrimenti VS non produrrà la stringa destra letterale). Il file scritto dal programma conterrà la versione UTF-8 di quella stringa. Oppure si può fare:
int main() {
if(FILE *f = fopen("tmp","w"))
fprintf(f,"%s\n","кошка 日本国");
}
In questo caso è necessario salvare il file come UTF-8 senza firma, perché si vuole il compilatore di pensare la codifica sorgente è la stessa della codifica di esecuzione ... Questo è un po 'un hack che si basa sul comportamento del compilatore, IMO, rotto.
È possibile fare praticamente la stessa cosa con qualsiasi altra API per scrivere caratteri stretti in un file, ma si noti che nessuno di questi metodi funziona per scrivere UTF-8 sulla console di Windows. Poiché il runtime C e/o la console sono un po 'rotti, è possibile scrivere UTF-8 direttamente sulla console eseguendo SetConsoleOutputCP (65001) e quindi utilizzando una delle varietà di funzioni puts
.
Se si desidera utilizzare caratteri larghi anziché caratteri stretti, i metodi basati sulle impostazioni locali e le modalità di impostazione sui descrittori di file potrebbero entrare in gioco.
#include <cstdio>
#include <fcntl.h>
#include <io.h>
int main() {
if(FILE *f = fopen("tmp","w")) {
_setmode(_fileno(f), _O_U8TEXT);
fwprintf(f,L"%s\n",L"кошка 日本国");
}
}
#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";
}
}
Vedi gli altri post su Unicode in C++ http://stackoverflow.com/questions/55641/unicode-in-c – Dave
Si può provare a vedere questa discussione [entra descrizione Link qui] [1] [1]: http://stackoverflow.com/questions/2543346/how-to-write-unicode-hello-world-in-c-on-windows – Jepessen