解决Mygui不支持中文路径
昨日不可追, 今日尤可为.勤奋,炽诚,不忘初心
外国人写的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不支持中文路径相关推荐
- 解决tomcat不支持中文路径的问题
问题描述: 开发文件下载功能时,因为需求比较简单,要求下载一个说明文件.于是,直接给出了文件所在服务器的地址,通过链接直接下载此文件(因需求简单,未考虑安全方面的问题-_-||). 在这个过程中,文件 ...
- opencv中的imread不支持中文路径的解决办法
其实严格来说,不是imread不支持中文路径,而是不支持non-ascii.所以不论路径如何转换编码格式,应该都不能解决问题. 解决的思路就是先用其他支持中文的API,把图片数据导入到内存中,然后通过 ...
- svn不支持中文路径问题的解决
作者:朱金灿 来源:http://blog.csdn.net/clever101 svn的授权文件authz默认是不支持中文路径的,因此在精确控制中文文件夹的授权时往往会出错.要解决这个问题,需要用U ...
- 浅析GDAL库C#版本支持中文路径问题
GDAL库对于C#的支持问题还是蛮多的,对于中文路径的支持就是其中之一(另一个就是通过OGR库获取图形的坐标信息). 关于C#支持中文路径,看过我之前博客的应该都不陌生,如果使用的是我修改过的GDAL ...
- 使用SQLite3支持中文路径
最近编写控制点库的几何精校正中使用SQLite来管理控制点,在使用过程中发现SQLite发现不支持中文路径,打开中文路径的数据库在查询的时候提示"no such table: ***&quo ...
- java压缩解压缩_利用Java实现压缩与解压缩(zip、gzip)支持中文路径
zip扮演着归档和压缩两个角色:gzip并不将文件归档,仅只是对单个文件进行压缩,所以,在UNIX平台上,命令tar通常用来创建一个档案文件,然后命令gzip来将档案文件压缩. Java I/O类库还 ...
- nginx文件服务器中文路径,nginx配置文件支持中文路径.htm
nginx配置文件支持中文路径 nginx配置文件支持中文路径 例子: server { color=#ff0000>charset utf-8; listen 8088; se ...
- GDAL支持中文路径-属性表支持中文配置
// 为了支持中文路径 OSGeo.GDAL.Gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES"); // ...
- QT中使用 WinExec API 参数不支持中文路径的解决办法
在QT中使用WinExec时,发现如果调用外部程序,如果路径或者参数含有中文路径,可能导致无法打开应用程序或者无法使用参数,解决办法,下面是简单的解决办法: QString strImagePath ...
最新文章
- 身份证号码对应地区-官方措辞:行政区划代码
- ElasticSearch之Java Api 测试
- SQL 注入式攻击的本质
- wpf控件设计时支持(3)
- 高并发环境下的Nginx该如何优化,让用户再也不会说卡
- 休眠锁定模式–乐观锁定模式如何工作
- *【CF#633B】 A Trivial Problem(二分或枚举)
- Android 系统(228)---NITZ网络自动对时功能不起作用
- 面试突然问Java多线程底层原理,我哭了!
- pg日期转周_postgres日期格式转换
- mysql number 类型_MySQL 数据类型(转)
- 富士施乐Fuji Xerox DocuCentre-III C6500 驱动
- linux双网卡透明网桥,两种网桥透明网桥和源路由选择网桥
- xcode 中生成和打包 ipa文件的方法和步骤
- Java控制excel,word文档只读模式
- 《做出好决定》当下决定将严重影响你未来的决定
- 网易视频云首推多路互动直播,首批测试邀请火爆来袭
- 一些版本管理常用的文档链接
- 黑苹果 wifi android,黑苹果目前已可以完美驱动内置intel WiFi
- Matlab中的元胞数组
热门文章
- Servlet总结待续
- 计算机病毒考试及答案,计算机病毒类考试题目以及参考答案.doc
- win10-weblogic12.1.1.0新建域
- ACWING133. 蚯蚓(栈)
- 神仙传服务器修改,神仙传
- 原来微信发送500M文件很简单!改个后缀就能一键发送,厉害了
- 《中华人民共和国数据安全法》条款解读与分析
- twitter和新浪微博--比较
- 中兴冲破“阈值”,家庭监控市场或将重新排位
- linux改文件权限为root,Linux创建root不可修改删除而只可追加权限的文件