Nie powinieneś potrzebować ustawiania ustawień regionalnych lub ustawiania żadnych specjalnych trybów w pliku, jeśli chcesz tylko użyć fprintf. Po prostu musisz używać kodowanych łańcuchów 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());
}
Zapisz program jako UTF-8 z podpisem lub UTF-16 (czyli nie używać UTF-8 bez podpisu, w przeciwnym razie nie będzie produkować VS prawy ciąg dosłowny). Plik napisany przez program będzie zawierał wersję UTF-8 tego łańcucha. Albo można zrobić:
int main() {
if(FILE *f = fopen("tmp","w"))
fprintf(f,"%s\n","кошка 日本国");
}
W tym przypadku należy zapisać plik jako UTF-8 bez podpisu, ponieważ chcesz kompilator myśleć kodowanie źródło jest takie samo jak kodowanie wykonanie ... To to trochę hack, który polega na kompilacji, IMO, złamanym zachowaniu.
Możesz zrobić zasadniczo to samo z każdym innym interfejsem API do pisania wąskich znaków do pliku, ale pamiętaj, że żadna z tych metod nie działa przy zapisywaniu UTF-8 na konsoli Windows. Ponieważ środowisko uruchomieniowe C i/lub konsola są nieco uszkodzone, możesz napisać kodowanie UTF-8 bezpośrednio do konsoli, wykonując SetConsoleOutputCP (65001), a następnie używając jednej z różnorodnych funkcji puts
.
Jeśli chcesz używać szerokich znaków zamiast wąskich znaków, wówczas można zastosować metody oparte na locale i tryby ustawień deskryptorów plików.
#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";
}
}
Zobacz inne posty o Unicode w C++ http://stackoverflow.com/questions/55641/unicode-in-c – Dave
Można spróbować, aby zobaczyć ten wątek [enter opis Link tutaj] [1] [1]: http://stackoverflow.com/questions/2543346/how-to-write-unicode-hello-world-in-c-on-windows – Jepessen