测试条件:
文件名包含部分中文或韩语文字,测试fopen打开
测试场景1
代码段:
QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));
SetFileApisToOEM();
FILE* fp = fopen(name.toLocal8Bit().data(), "r");
qDebug("data printf %s, %s,%s", name.toUtf8().data(),name.toLatin1().data(),name.toLocal8Bit().data());
打印的内容:
data printf I:/work/안녕하세요/123.txt, I:/work/?????/123.txt,I:/work/안녕하세요/123.txt
open fail errno = 42 reason = Illegal byte sequence
结论:
fopen不支持utf-8
测试场景2
代码段:
QTextCodec::setCodecForLocale(QTextCodec::codecForName("GBK"));
SetFileApisToANSI();
FILE* fp = fopen(name.toLocal8Bit().data(), "r");
qDebug("data printf %s, %s,%s", name.toUtf8().data(),name.toLatin1().data(),name.toLocal8Bit().data());
打印的内容:
data printf I:/work/你好/123.txt, I:/work/??/123.txt,I:/work/����/123.txt
open file ok
data printf I:/work/안녕하세요/123.txt, I:/work/?????/123.txt,I:/work//123.txt
open fail errno = 2 reason = No such file or directory
现象:支持中文打开,韩语不支持
结论:部分中文支持GBK编码,所以能打开
正确的打开方式:
FILE *fp = _wfopen(name.toStdWString().c_str(),L"r");
测试中文、韩语打开都支持
参考文章(或链接):
fopen, _wfopen
https://docs.microsoft.com/zh-cn/cpp/c-runtime-library/reference/fopen-wfopen?view=msvc-170
文件名中使用的字符集
https://docs.microsoft.com/en-us/windows/win32/intl/character-sets-used-in-file-names
SetFileApisToOEM function
https://docs.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-setfileapistooem
以上测试基于修改系统区域至朝鲜语环境下测试,文章仅代表个人观点,如有错误欢迎留言评论