查看: 5712|回复: 10

MFC使用OSG,打开中文路径的文件失败

[复制链接]

该用户从未签到

发表于 2009-8-26 14:31:02 | 显示全部楼层 |阅读模式
大家好:
     现在做一个使用OSG的MFC程序,但是打开中文路径的IVE文件时失败,
     看了大家以前的帖子,
     可以使用setlocale( LC_ALL, ".936" );或者setlocale( LC_ALL, "chs" );来解决
     但是碰到一个问题是该MFC工程的“MFC的使用”选项必须用“在共享DLL中使用MFC”,
     如果用其他"在静态库中使用 MFC"或者"使用标准 Windows 库"都读取失败
     
     测试程序是用了一个MFC的Dialog,加了一个Button,在Button_Click代码中加入以下代码:
     ----------------------------------------------------------------------------------
     setlocale( LC_ALL, "chs" );
     osg::Node *root = osgDB::readNodeFile("c:\\我的\\Simple.ive");
     ----------------------------------------------------------------------------------
     结果显示root为NULL,请大家帮忙。

     不管该工程的字符集是使用"使用多字节字符集" 还是"使用 Unicode 字符集"

该用户从未签到

 楼主| 发表于 2009-8-26 14:33:57 | 显示全部楼层
本帖最后由 tygh2000 于 2009-8-26 14:57 编辑

OSG的版本是2.6, vs2005

该用户从未签到

发表于 2009-8-26 15:40:43 | 显示全部楼层
setlocale( LC_ALL, "chs" )设置一次就可以了,它不是OSG函数,因此和OSG版本没有关系。至于在MFC下有没有别的地方要改,我个人不是很了解,我不使用MFC。

该用户从未签到

 楼主| 发表于 2009-8-26 15:55:09 | 显示全部楼层
感谢array老大回复!
我只是用VS2005生成了一个VC的Dialog程序,然后添加了一个Button控件,
之后在Button的Click事件中追加了以下的代码
void CtestOSG_MFCDlg::OnBnClickedButton1()
{
        setlocale( LC_ALL, "chs" );
        osg::Node *root = osgDB::readNodeFile("c:\\我的Simple.ive");
}

跟踪看了root变量,结果为
+                root        0x00000000 {_initialBound={...} _computeBoundCallback={...} _boundingSphere={...} ...}        osg::Node *

感觉没有正确读入,
但是如果把该工程的属性-->配置属性--->常规-->"MFC的使用"修改成为"在共享 DLL 中使用 MFC"后root就变为
+                root        0x00e917f0 {_initialBound={...} _computeBoundCallback={...} _boundingSphere={...} ...}        osg::Node *

应该就是正确读入了,
很奇怪呢!

该用户从未签到

发表于 2009-12-11 09:45:11 | 显示全部楼层
我也遇到这个问题了....不知楼主解决了吗?

该用户从未签到

发表于 2009-12-12 00:33:55 | 显示全部楼层
注意转换为宽字符,,然后在初始化的地方先调用setlocal()~~~~~~~~

该用户从未签到

发表于 2009-12-12 11:20:40 | 显示全部楼层
谢谢版主,已经在初始化的时候setlocal() 了。

MFC采用动态链接dll没有问题,

采用“在静态库中使用 MFC"就不行....

该用户从未签到

发表于 2009-12-12 14:19:48 | 显示全部楼层
注意先调用setlocal(),,然后再转换为宽字符,应该不会有问题的,你试试吧,,跟踪一下路径就知道了~~~~~~

该用户从未签到

发表于 2010-1-12 10:33:20 | 显示全部楼层
我也遇到过这种问题,设置setlocale( LC_ALL, "chs" )不起作用,不知什么原因。
后来用UTF-8格式就都正确了,以下是将const wchar_t* 转化为 UTF-8格式的函数:
//ANSI字符串转化为UTF-8字符串,用于SQLite语句
char * convertUTF8(const wchar_t* inStr)
{
        DWORD dwNum = WideCharToMultiByte(CP_UTF8,NULL,inStr,-1,NULL,0,NULL,FALSE);
        char *s;
        s = new char[dwNum];
        if(!s)
        {
           delete []s;
        }
        WideCharToMultiByte (CP_UTF8,NULL,inSQL,-1,s,dwNum,NULL,FALSE);
        return s;
}

如果使用std::string,可以使用函数convertUTF8toUTF16转换为宽字符,这个函数在OSGDB::ConvertUTF中。

该用户从未签到

发表于 2010-1-12 10:59:15 | 显示全部楼层
还有在读取图片时候也无法识别中文路径,即使转换成UTF-8也无法识别,据查是ifstream的问题,后来修改了libJPEG的源码,才能识别中文。(我的环境是VS2008)以下是修改的代码:

...
#include <osgDB/ConvertUTF>
...

virtual ReadResult readImage(const std::string& file, const osgDB::ReaderWriter::Options* options) const
        {
            std::string ext = osgDB::getLowerCaseFileExtension(file);
            if (!acceptsExtension(ext)) return ReadResult::FILE_NOT_HANDLED;

            std::string fileName = osgDB::findDataFile( file, options );
            if (fileName.empty()) return ReadResult::FILE_NOT_FOUND;
                       
                        //中文路径
            std::ifstream istream(osgDB::convertUTF8toUTF16(fileName.c_str()).c_str(), std::ios::in | std::ios::binary);
                        //std::ifstream istream(fileName.c_str(), std::ios::in | std::ios::binary);
                        if(!istream) return ReadResult::ERROR_IN_READING_FILE;
            ReadResult rr = readJPGStream(istream);
            if(rr.validImage()) rr.getImage()->setFileName(file);
            return rr;
        }

该用户从未签到

 楼主| 发表于 2011-7-6 15:32:51 | 显示全部楼层
唉,时间太久,自己怎么解决的也忘了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表