让Ogre支持中文路径与中文文件名

138 篇文章 0 订阅

Ogre中路径与文件名不支持中文,这是VS2005之后版本的std::fstream对中文路径处理不正确的原因,所以加载中文路径或文件名不成功,解决办法:

                  在主函数开始加入  setlocale(LC_ALL,"Chinese-simplified"); 

 
例如:

  view plaincopy to clipboardprint?
virtual void createScene(void)   
 {    
   setlocale(LC_ALL,"Chinese-simplified");   
   Entity* ogreHead = mSceneMgr->createEntity("Head","左慈头.mesh");   
  SceneNode* headNode = mSceneMgr->getRootSceneNode()->createChildSceneNode();   
   headNode->attachObject(ogreHead);   
  
   mSceneMgr->setAmbientLight(ColourValue(0.5, 0.5, 0.5));   
 }  
   virtual void createScene(void)
    { 
      setlocale(LC_ALL,"Chinese-simplified");
      Entity* ogreHead = mSceneMgr->createEntity("Head","左慈头.mesh");
     SceneNode* headNode = mSceneMgr->getRootSceneNode()->createChildSceneNode();
      headNode->attachObject(ogreHead);

      mSceneMgr->setAmbientLight(ColourValue(0.5, 0.5, 0.5));
    }
 

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zyfu0000/archive/2009/12/07/4958731.aspx

 

Ogre的文件读取是使用的标准库的io库读取的,众所周知的是,在vs2005是存在着bug的。
因此想要一劳永逸的解决这个办法唯有去修改Ogre的源代码,以下为修改方法:

打开OgreFileSystem.cpp文件,找到FileSystemArchive::open方法,使用以下代码替换之:
DataStreamPtr FileSystemArchive::open( const  String &  filename)  const
    
{
         String full_path 
= concatenate_path(mName, filename);

        
// Use filesystem to determine size 
        
// (quicker than streaming to the end and back)
        struct stat tagStat;
        
int ret = stat(full_path.c_str(), &tagStat);
         assert(ret 
== 0 && "Problem getting file size" );

        
// Always open in binary mode
        static std::vector<wchar_t>     s_wchar_buf((size_t)128);
         size_t lengthUnicode 
= MultiByteToWideChar(CP_ACP, 0, full_path.c_str(), full_path.size(), NULL, 0);
        
if (s_wchar_buf.size() < lengthUnicode + 1)
        
{
             s_wchar_buf.resize(lengthUnicode 
* 2);
         }

         wchar_t
* szUnicode = &s_wchar_buf[0];
         MultiByteToWideChar(CP_ACP, 
0, full_path.c_str(), full_path.size(), szUnicode, lengthUnicode);
         szUnicode[lengthUnicode] 
= 0;
         std::ifstream
* origStream = new std::ifstream();
         origStream
->open(szUnicode, std::ios::in | std::ios::binary);

        
// Should check ensure open succeeded, in case fail for some reason.
        if (origStream->fail())
        
{
             delete origStream;
             OGRE_EXCEPT(Exception::ERR_FILE_NOT_FOUND,
                
"Cannot open file: " + filename,
                
"FileSystemArchive::open");
         }


        
/// Construct return stream, tell it to delete on destroy
         FileStreamDataStream* stream = new FileStreamDataStream(filename,
             origStream, tagStat.st_size, 
true);
        
return DataStreamPtr(stream);
     }

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

下面是一段ogre中的文件操作相关的源码

代码
    DataStreamPtr FileSystemArchive::open( const  String &  filename)  const
    {
        String full_path 
=  concatenate_path(mName, filename);

        
//  Use filesystem to determine size 
        
//  (quicker than streaming to the end and back)
         struct  stat tagStat;
    
int  ret  =  stat(full_path.c_str(),  & tagStat);
        assert(ret 
==   0   &&   " Problem getting file size "  );

        
//  Always open in binary mode
        std::ifstream  * origStream  =  OGRE_NEW_T(std::ifstream, MEMCATEGORY_GENERAL)();
        origStream
-> open(full_path.c_str(), std::ios:: in   |  std::ios::binary);

        
//  Should check ensure open succeeded, in case fail for some reason.
         if  (origStream -> fail())
        {
            OGRE_DELETE_T(origStream, basic_ifstream, MEMCATEGORY_GENERAL);
            OGRE_EXCEPT(Exception::ERR_FILE_NOT_FOUND,
                
" Cannot open file:  "   +  filename,
                
" FileSystemArchive::open " );
        }

        
///  Construct return stream, tell it to delete on destroy
        FileStreamDataStream *  stream  =  OGRE_NEW FileStreamDataStream(filename,
            origStream, tagStat.st_size, 
true );
        
return  DataStreamPtr(stream);
    }

 

 

主要的代码是

 

origStream -> open(full_path.c_str(), std::ios:: in   |  std::ios::binary);

 

 

 

通过在文件流打开文件之前,我们设置一下语言环境

 

std::locale:: global (std::locale( "" ));

 

 

 

接下来我们发现,中文路径的问题解决了,但是向文件中写入整型或浮点型数据时会有问题,比如“1000”,输出之后就成了“1,000”

这正是因为我们改变了语言环境的原因,为了将修改减少到最小,我们应该在文件打开完毕后,恢复之前的设置

 

std::locale saveLocal  =  std::locale:: global (std::locale( "" ));
origStream
-> open(full_path.c_str(), std::ios:: in   |  std::ios::binary);
std::locale::
global (saveLocal);

 

 

 

everything is fine now~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
万能注册验证模块.ec 专用模块.ec 世恒通用安装系统文件压缩模块.ec 丫头皮肤模块.ec 五笔编码查询模块.ec 优化内存.ec 优化内存模块.ec 优码专用模块.ec 伟业超级列表框列宽尺寸自动调整.ec 伟业高级表格列宽尺寸自动调整.ec 信息提示框控件(Tip).ec 修改菜单1.0版.ec 全面操作SQL Server 2000.ec 写屏幕.ec 删除文件模块.ec 删除文本所在行.ec 十六进制转十进制模块 .ec 十进制转化为十六进制5.ec 压缩加密文件夹.ec 压缩文件夹.ec 双功能自动编号模块.ec 取十进制.ec 取句柄对应全路径文件名2.1.ec 取图片尺寸.ec 取声调拼音模块1.0.ec 取姓名.ec 取拼音带声调1.2.ec 取拼音首个字母.ec 取拼音首模块.ec 取控件或窗口的标题.ec 取文件时间.ec 取文件版本信息.ec 取文件相关联的图标.ec 取文件行数.ec 取文本行数.ec 取易模块信息.ec 取注册表键句柄.ec 取用户机器码模块.ec 取系统信息.ec 取系统信息v2.1.ec 取系统启动时间.ec 取系统字体列表1.2.ec 取系统目录.ec 取网卡参数.ec 取网页元素.ec 取腾讯TT浏览器的地址栏文本模块.ec 同步目录.ec 同步缩放控件.ec 同步缩放控件1.0.ec 同步缩放窗口1.0.ec 吸码皇API.ec 吸附模块.ec 响应左键放开.ec 四则混合运算模块.ec 图形窗口模块.ec 图片演示-西风.EC 图片演示.EC 图片组操作类.ec 土豆懒人模块.ec 在线更新.ec 在线更新2.ec 在线查找歌词.ec 填充树型框.ec 外挂作坊1.4.ec 外挂作坊1.40909.ec 外挂作坊1.5-第六版.ec 外挂作坊1.5.ec 外挂作坊1.5去广告.ec 外挂作坊1.5版.ec 外挂作坊1.8.ec 外挂作坊1.8版.ec 外挂作坊1.8破解版.ec 外挂作坊1.8第五破解版.ec 外挂作坊2.0.ec 外挂作坊2.03增强模块.ec 外挂作坊2.0破解版.ec 外挂作坊2.3完美破解版.ec 外挂作坊3.0.ec 外挂作坊3.X.ec 外挂作坊模块(新年礼品).ec 外挂作坊模块2.3.ec 外挂作坊模块破解版.ec 外挂作坊网游模块.ec 外挂海-超线程下载模块.ec 外挂海USB按键测试版.ec 外挂海万能模块.ec 外挂海万能模块1.52.ec 外挂海万能模块1.57B.ec 外挂海万能模块1.58.ec 外挂海万能模块1.59.ec 外挂海万能模块1.70贺岁版.ec 外挂海万能模块1.71.ec 外挂海万能模块1.7贺岁版.ec 外挂海万能模块1.81版.ec 外挂海万能模块1.84版.ec 外挂海万能模块1.85版.ec 外挂海万能模块1.87版.ec 外挂海万能模块1.92.ec 外挂海万能模块1.95.ec 外挂海万能模块1.96.ec 外挂海万能模块2.07.ec 外挂海万能模块2.1(贺岁版).ec 外挂海截图模块1[1].0.ec 外挂海模块.ec 外挂海模块1.35.ec 外挂海模块1.36.ec 外挂海模块1.37.ec 外挂海模块1.38.ec 外挂海模块1.39.ec 外挂海模块1.40.ec 外挂海模块1.41.ec 外挂海模块1.42.ec 外挂海模块1.43.ec 外挂海模块1.44.ec 外挂海模块1.45.ec 外挂海模块1.46.ec 外挂海模块1.47.ec 外挂海模块1.49.ec 外挂海模块1.50.ec 外挂海模块1.51.ec 外挂海模块1.52.ec 外挂海模块1.6(恶魔版).ec 外挂海模块1.6Beta2斩月内测版.ec 外挂海模块高级版.ec 外挂海汇编模块.ec 外部列表框全操作.ec 外部控件操作类.ec 外部数据库.ec 外部超级列表框类.ec 天气预报信息.ec 威灵-简装版.ec 威灵.ec 字段不重复.ec 字节集.ec 字节集到十六进制文本.ec 字节集增强模块.ec 完全进制转换.ec 寻找子文件夹.ec 寻找注册表.ec 寻找磁盘文件.ec 寻找磁盘文件模块 1.0.ec 寻找窗口内指定按钮并单击.ec 小小鸡内存优化.ec 小磊专用模块.ec 小维皮肤模块.ec 小金更换衣服皮肤模块.ec 小鱼儿.ec 少男少女论坛万能模块.ec 属性夹.ec 异常通知辅助模块.ec 形象大使1.0.ec 循环冗余校验.EC 我的信息框.ec 我的对话框.ec 所有模块.ec 执行批文件.ec 执行文件模块.ec 提升权限.ec 提升进程权限.ec 提示框模块2.6.ec 提示框模块2.61.ec 提示框模块2.7.ec 提示框模块2.72Alpha版.ec 提示框模块3.1

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值