如何在C+中使用fprintf编写UTF-8文件+; 我在C++中用VisualStudio和MFC编程。我用fopen和fprintf写了一个文件。该文件应采用UTF8编码。有没有可能这样做?不管我怎么做,该文件要么是双字节unicode编码,要么是ISO-8859-2(拉丁文2)编码

如何在C+中使用fprintf编写UTF-8文件+; 我在C++中用VisualStudio和MFC编程。我用fopen和fprintf写了一个文件。该文件应采用UTF8编码。有没有可能这样做?不管我怎么做,该文件要么是双字节unicode编码,要么是ISO-8859-2(拉丁文2)编码,c++,utf-8,mfc,fopen,printf,C++,Utf 8,Mfc,Fopen,Printf,Glanebridge理论上,您只需设置一个使用UTF-8作为外部编码的区域设置。我的理解是,我不是Windows程序员,所以您必须求助于特定于实现的方法或非特定于实现的方法(Dave评论中的链接)。是的,但您需要Visual Studio 2005或更高版本。然后,您可以使用以下参数调用fopen: LPCTSTR strText = "абв"; FILE *f = fopen(pszFilePath, "w,ccs=UTF-8"); _ftprintf(f, _T("%s"), (LPC

Glanebridge

理论上,您只需设置一个使用UTF-8作为外部编码的区域设置。我的理解是,我不是Windows程序员,所以您必须求助于特定于实现的方法或非特定于实现的方法(Dave评论中的链接)。

是的,但您需要Visual Studio 2005或更高版本。然后,您可以使用以下参数调用fopen:

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

请记住,这是Microsoft扩展,它可能无法与gcc或其他编译器一起使用。

如果您只想使用fprintf,则不需要设置语言环境或在文件上设置任何特殊模式。您只需使用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());
}
在这种情况下,您必须将文件保存为UTF-8而不带签名,因为您希望编译器认为源编码与执行编码相同。。。依我看,这有点像黑客,依赖于编译器的坏行为

您可以对任何其他API执行基本相同的操作,将窄字符写入文件,但请注意,这些方法都无法将UTF-8写入Windows控制台。由于C运行时和/或控制台有点损坏,您只能通过执行SetConsoleOutputCP(65001),然后使用一个
puts
函数将UTF-8直接写入控制台

如果您想使用宽字符而不是窄字符,那么基于区域设置的方法和文件描述符的设置模式可以发挥作用

#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"кошка 日本国");
    }
}
#包括
#包括
#包括
int main(){
如果(文件*f=fopen(“tmp”,“w”)){
_setmode(_fileno(f),_O_u8文本);
fwprintf(f,L“%s\n”,L”а日本国");
}
}

#包括
#包括
int main(){
if(自动f=std::wofstream(“tmp”)){
f、 imbue(std::locale(std::locale(),
新std::codecvt_utf8_utf16));//假设wchar_t是UTF-16

f在C++中查看关于Unicode的其他帖子,您可以尝试查看此线程[输入链接描述](1)[ 1 ]:我认为这不会影响使用fprintf写入文件的数据。您需要使用_ftprintf。请参阅我答案中的更改。或者简单地使用fwprintf。问题是,
ccs=UTF-8
设置文件上的_O_u8;文本模式,以便向文件写入宽字符将导致输出UTF-8。使用此m写入窄字符ode集将导致错误。你的意思是你已经有了一个UTF-8文本的缓冲区吗?在这种情况下,为什么不直接以二进制模式打开文件,并用fwrite将缓冲区写入其中?不,我的意思是,因为只有当TCHAR和所有T函数解析为wchar_T函数时,使用tprintf才会在这里起作用,为什么不直接使用wchar_T函数呢ly?TCHAR仅在程序实际要在char和wchar__Āt之间切换时才有用。如果您不想同时使用这两种字符,那么就没有理由使用TCHAR。
FILE*f=fopen(文件名,“w,css=UTF-8”);fwprintf(f,L“%s”,L“аабб
@Nicolabolas第一个示例使用C++11中的wstring_convert,但是任何其他获得UTF-8编码的方法也可以,例如WideChartMultiByte。最后一个示例使用C++11编解码器方面,没有内置的C++11之前的替换。其他两个示例不使用C++11。
#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";
    }
}