昨日不可追, 今日尤可为.勤奋,炽诚,不忘初心


外国人写的Mygui库,不支持中文路径,情有可原,中文编码嘛,中国的标准,对吧.

但是! 中国那么多用Mygui的大虾呢?网上居然找不到一篇博客是解决Mygui中文路径的,这是我无法容忍的,

我更加无法容忍的,是那种逃避的心理 :我问了很多人,想询问一些解决方案,绝大多数人反问说:不能用中文,那干嘛用中文...

(其实我是第一个想逃的,被老大教训了一通,人呐,不逼逼就不能称得上是人~!都是被逼出来的~...)

行吧,搞就搞吧,准备了度娘,狗狗,鼻音,还怕有解决不了的问题吗,害怕搜不到答案吗?

结果...充分验证了墨菲定律(如果一件事情有可能发生,那么她一定会发生...)

搜了一天无果,再无法淡定,破骂网上一群庸才耳.

问题还是要解决的:通过这次的研究,明白了一些编码的原理个规则,还有,出现乱码的原因.

从问题入手,抓住主要矛盾.老毛的源程序用了中文路径后,就会报:throw invalid_data( "invalid UTF-8 sequence header value" );

即无效的UTF-8,可以推断出,老毛采用的是UTF-8编码.

关于UTF-8的介绍,有一篇文章写的还是不错,百度的解释,云里雾里,魂淡.

博客地址:UTF-8编码介绍

我感觉啊,vs(中国)默认用的是ANSI编码(简体中文)

ansi的给力解释:

写一些转换函数:

 //--------------------begin------------------------------------------------------------------string UnicodeToUTF8(const wchar_t* str){char* result;int textlen;textlen = WideCharToMultiByte(CP_UTF8, 0, str, -1, NULL, 0, NULL, NULL);result = (char *)malloc((textlen + 1)*sizeof(char));memset(result, 0, sizeof(char)* (textlen + 1));WideCharToMultiByte(CP_UTF8, 0, str, -1, result, textlen, NULL, NULL);return result;}wchar_t * ANSIToUnicode(const char* str){int textlen;wchar_t * result;textlen = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0);result = (wchar_t *)malloc((textlen + 1)*sizeof(wchar_t));memset(result, 0, (textlen + 1)*sizeof(wchar_t));MultiByteToWideChar(CP_ACP, 0, str, -1, (LPWSTR)result, textlen);return result;}string ANSIToUTF8(const string str){return UnicodeToUTF8(ANSIToUnicode(str.c_str()));}//--------------------end------------------------------------------------------------------

修改Mygui源文件目录MyGUI_3.2.0\Platforms\DirectX\DirectXPlatform\src下的MyGUI_DirectXDataManager.cpp文件,修改addResourceLocation这个函数

代码如下:

 void DirectXDataManager::addResourceLocation(const std::string& _name, bool _recursive){ArhivInfo info;//将路径名字转成utf-8格式编码:string utf8Name = ANSIToUTF8(_name);info.name = MyGUI::UString(utf8Name).asWStr();info.recursive = _recursive;mPaths.push_back(info);}

光这样还不行,因为加载资源的时候,windows不认识UTF-8编码格式(知道这个很重要.)

所以,真正加载资源的时候,要把utf8再转换成ANSI(windows不认识utf8,这个说过了)

代码如下:

添加 Utf8到ANSI的转换函数:

string  Utf8ToGBK(const std::string& strUTF8)//转GBK测试结果也对,不知道可不可以.以后验证了再改
{int len = MultiByteToWideChar(CP_UTF8, 0, strUTF8.c_str(), -1, NULL, 0);unsigned short * wszGBK = new unsigned short[len + 1];memset(wszGBK, 0, len * 2 + 2);MultiByteToWideChar(CP_UTF8, 0, (LPCTSTR)strUTF8.c_str(), -1, (LPWSTR)wszGBK, len);len = WideCharToMultiByte(CP_ACP, 0, (LPWSTR)wszGBK, -1, NULL, 0, NULL, NULL);char *szGBK = new char[len + 1];memset(szGBK, 0, len + 1);WideCharToMultiByte(CP_ACP, 0, (LPWSTR)wszGBK, -1, szGBK, len, NULL, NULL);//strUTF8 = szGBK; std::string strTemp(szGBK);delete[]szGBK;delete[]wszGBK;return strTemp;
}

修改MyGUI_DirectXDataManager.cpp中getData函数:

代码如下:

 IDataStream* DirectXDataManager::getData(const std::string& _name){std::string filepath = getDataPath(_name);//utf8转ansistring relpath = Utf8ToGBK(filepath);if (relpath.empty())//filepathreturn nullptr;std::ifstream* stream = new std::ifstream();stream->open(relpath.c_str(), std::ios_base::binary);if (!stream->is_open()){delete stream;return nullptr;}DataFileStream* data = new DataFileStream(stream);return data;}

结果图展示:

转换函数可能有问题,最后可能应该转成ANSI,而我转成了GBK,不知道可不可以.

修改了作者源库文件,要重新编译,把dll,lib,头文件更新到自己的程序中...



解决Mygui不支持中文路径相关推荐

  1. 解决tomcat不支持中文路径的问题

    问题描述: 开发文件下载功能时,因为需求比较简单,要求下载一个说明文件.于是,直接给出了文件所在服务器的地址,通过链接直接下载此文件(因需求简单,未考虑安全方面的问题-_-||). 在这个过程中,文件 ...

  2. opencv中的imread不支持中文路径的解决办法

    其实严格来说,不是imread不支持中文路径,而是不支持non-ascii.所以不论路径如何转换编码格式,应该都不能解决问题. 解决的思路就是先用其他支持中文的API,把图片数据导入到内存中,然后通过 ...

  3. svn不支持中文路径问题的解决

    作者:朱金灿 来源:http://blog.csdn.net/clever101 svn的授权文件authz默认是不支持中文路径的,因此在精确控制中文文件夹的授权时往往会出错.要解决这个问题,需要用U ...

  4. 浅析GDAL库C#版本支持中文路径问题

    GDAL库对于C#的支持问题还是蛮多的,对于中文路径的支持就是其中之一(另一个就是通过OGR库获取图形的坐标信息). 关于C#支持中文路径,看过我之前博客的应该都不陌生,如果使用的是我修改过的GDAL ...

  5. 使用SQLite3支持中文路径

    最近编写控制点库的几何精校正中使用SQLite来管理控制点,在使用过程中发现SQLite发现不支持中文路径,打开中文路径的数据库在查询的时候提示"no such table: ***&quo ...

  6. java压缩解压缩_利用Java实现压缩与解压缩(zip、gzip)支持中文路径

    zip扮演着归档和压缩两个角色:gzip并不将文件归档,仅只是对单个文件进行压缩,所以,在UNIX平台上,命令tar通常用来创建一个档案文件,然后命令gzip来将档案文件压缩. Java I/O类库还 ...

  7. nginx文件服务器中文路径,nginx配置文件支持中文路径.htm

    nginx配置文件支持中文路径 nginx配置文件支持中文路径 例子: server { color=#ff0000>charset utf-8; listen 8088;         se ...

  8. GDAL支持中文路径-属性表支持中文配置

    // 为了支持中文路径 OSGeo.GDAL.Gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES"); // ...

  9. QT中使用 WinExec API 参数不支持中文路径的解决办法

    在QT中使用WinExec时,发现如果调用外部程序,如果路径或者参数含有中文路径,可能导致无法打开应用程序或者无法使用参数,解决办法,下面是简单的解决办法: QString strImagePath ...

最新文章

  1. 身份证号码对应地区-官方措辞:行政区划代码
  2. ElasticSearch之Java Api 测试
  3. SQL 注入式攻击的本质
  4. wpf控件设计时支持(3)
  5. 高并发环境下的Nginx该如何优化,让用户再也不会说卡
  6. 休眠锁定模式–乐观锁定模式如何工作
  7. *【CF#633B】 A Trivial Problem(二分或枚举)
  8. Android 系统(228)---NITZ网络自动对时功能不起作用
  9. 面试突然问Java多线程底层原理,我哭了!
  10. pg日期转周_postgres日期格式转换
  11. mysql number 类型_MySQL 数据类型(转)
  12. 富士施乐Fuji Xerox DocuCentre-III C6500 驱动
  13. linux双网卡透明网桥,两种网桥透明网桥和源路由选择网桥
  14. xcode 中生成和打包 ipa文件的方法和步骤
  15. Java控制excel,word文档只读模式
  16. 《做出好决定》当下决定将严重影响你未来的决定
  17. 网易视频云首推多路互动直播,首批测试邀请火爆来袭
  18. 一些版本管理常用的文档链接
  19. 黑苹果 wifi android,黑苹果目前已可以完美驱动内置intel WiFi
  20. Matlab中的元胞数组

热门文章

  1. Servlet总结待续
  2. 计算机病毒考试及答案,计算机病毒类考试题目以及参考答案.doc
  3. win10-weblogic12.1.1.0新建域
  4. ACWING133. 蚯蚓(栈)
  5. 神仙传服务器修改,神仙传
  6. 原来微信发送500M文件很简单!改个后缀就能一键发送,厉害了
  7. 《中华人民共和国数据安全法》条款解读与分析
  8. twitter和新浪微博--比较
  9. 中兴冲破“阈值”,家庭监控市场或将重新排位
  10. linux改文件权限为root,Linux创建root不可修改删除而只可追加权限的文件