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));
}
本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/zyfu0000/archive/2009/12/07/4958731.aspx
因此想要一劳永逸的解决这个办法唯有去修改Ogre的源代码,以下为修改方法:
打开OgreFileSystem.cpp文件,找到FileSystemArchive::open方法,使用以下代码替换之:





































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

{
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);
}
主要的代码是
通过在文件流打开文件之前,我们设置一下语言环境
接下来我们发现,中文路径的问题解决了,但是向文件中写入整型或浮点型数据时会有问题,比如“1000”,输出之后就成了“1,000”
这正是因为我们改变了语言环境的原因,为了将修改减少到最小,我们应该在文件打开完毕后,恢复之前的设置
origStream -> open(full_path.c_str(), std::ios:: in | std::ios::binary);
std::locale:: global (saveLocal);
everything is fine now~