如何在C++中使用fprintf编写UTF-8文件
How to write UTF-8 file with fprintf in C++
我(偶尔)使用Visual Studio和MFC在C++中编程。我用fopen和fprintf写了一个文件。该文件应使用UTF8进行编码。有可能这样做吗?无论我尝试什么,该文件要么是双字节unicode,要么是ISO-8859-2(latin2)编码。
Glanebridge
如果您只想使用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,"%sn",utf8_string.c_str());
}
将程序保存为带有签名的UTF-8或UTF-16(即不要使用没有签名的UTF-8,否则VS将不会生成正确的字符串文本)。程序编写的文件将包含该字符串的UTF-8版本。或者你可以做:
int main() {
if(FILE *f = fopen("tmp","w"))
fprintf(f,"%sn","кошка 日本国");
}
在这种情况下,您必须将文件保存为不带签名的UTF-8,因为您希望编译器认为源编码与执行编码相同。。。这是一个有点依赖于编译器IMO破坏行为的破解。
对于向文件中写入窄字符的任何其他API,基本上都可以执行相同的操作,但请注意,这些方法都不适用于向Windows控制台写入UTF-8。因为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"%sn",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";
}
}
可以,但您需要Visual Studio 2005或更高版本。然后,您可以使用以下参数调用fopen:
LPCTSTR strText = "абв";
FILE *f = fopen(pszFilePath, "w,ccs=UTF-8");
_ftprintf(f, _T("%s"), (LPCTSTR) strText);
请记住,这是Microsoft的扩展,它可能无法与gcc或其他编译器一起使用。
理论上,您应该简单地设置一个使用UTF-8作为外部编码的区域设置。我的理解是——我不是Windows程序员——Windows没有这样的区域设置,所以你必须求助于特定于实现的方法或非标准库(Dave评论中的链接)。
- 正在为Xtensa simcall函数编写回调函数
- 在程序中编写脚本来编写和编译代码
- 编写时C++中的输入重定向问题
- 在C++中,如何在类和函数(可能是模板化的)的头中编写完整的实现
- c++多进程编写一个唯一的文件
- 如何用C++编写BFS函数
- 编写代码时C++出现错误:错误 1 错误 C2601:'circle':本地函数定义是非法的
- 如何编写一个使用n倍三元条件语句的C++布尔函数
- 为C++03编译器编写部分unique_ptr,该编译器与较新的编译器在公共代码库上运行
- 如何为 C 型字符串数组编写 getter 和 setter?
- 如何在没有函数的情况下编写此代码并使C++更简单?
- 编写一个函数以使用 n 百分比的 CPU 使用率
- 如何使用OpenCV-C++编写*.mp4视频?
- 3-3. 编写一个程序来计算每个不同单词在其输入中出现的次数
- 我的目标是编写一个程序来计算和存储字符串在字符数组中出现的位置
- 如何编写带有异常的构造函数
- 如何为包含头文件的目标编写生成文件?
- 如何编写一个完美的缩写函数模板?
- 编写自定义 FPrintF
- 如何在C++中使用fprintf编写UTF-8文件