• 基于Visual Studio 2015 C++ Qt5读写中文路径和文件名的问题


    需求描述:使用Qt进行中文路径和中文文件名的读写是很方便的,特别是在Qt5之后,但有时因为某些原因不方便使用Qt实现,还是需要用C++完成,以下总结了两种方法。

    开发环境:win7/10;VS2010/2015;Qt4.8.6/5.7.1;CMake

    方法一:针对win7+VS2010+Qt4

    //用locale对象的name方法可以看到,通过locale("")构造出的locale 对象的name为"Chinese_People's Republic of China.936",
    //而原始的locale对象的name为"C",也就是缺省的ANSI_C公约。
    //注意:如果使用locale loc = locale::global(locale(""))设置全局locale后没有用 locale::global(loc)恢复的话,
    //那么在程序后面的cout语句就不能输出中文了,虽然这时候操作中文文件没有问题,但是这也是很容易让人掉入陷阱的地方,应该值得注意。
    //因为使用QString,所以对于QT还需设置其编码格式:在main.cpp中有	QTextCodec::setCodecForCStrings(QTextCodec::codecForLocale());
    /*
    #include <locale>
    */
    
    QString INPUT_FILE_PATH = tr("./中文路径/中文文件名.txt");
    std::ifstream fp;
    
    std::locale::global(std::locale(""));
    
    fp.open( INPUT_FILE_PATH.toStdString().c_str(), std::ios::in );
    
    std::locale::global(std::locale("C"));
    
    if(!fp.is_open())
    {
    	return;
    }
    else
    {...}
    

     方法二:针对win10+VS2015+Qt5

    //在win10下,使用方法一失效,估计是win10语言环境与win7有区别:)
    //以下方法是利用filesystem在vs2015(c++14)中的部分实现,结合Qt的基本功能,实现fstream文件读写。
    
    /*
    #include <filesystem>
    */
    
    QString INPUT_FILE_PATH = "./中文路径/中文文件名.bin";
    std::ifstream fp;
    
    std::experimental::filesystem::path INPUT_FILE_PATH_U16STRING = INPUT_FILE_PATH.toStdU16String();
    
    fp.open( INPUT_FILE_PATH_U16STRING, std::ios::in | std::ios::binary );
    
    if(!fp.is_open())
    {
    	return;
    }
    else
    {...}
    
  • 相关阅读:
    [算法] 带权图
    哥德巴赫猜想 ——— 极限算法(你要是能写出比我用时还短的代码算我输)
    详解 位运算
    内存对齐模式 —— 原理讲解
    C语言 文件操作
    指针与数组
    队列的实现
    堆栈的实现
    线性表 详讲及使用
    树莓派
  • 原文地址:https://www.cnblogs.com/JoyPoint/p/14561802.html
Copyright © 2020-2023  润新知