Collada exporter: Fix unicode filenames.

Although existing code uses "C" locale partially, both calls to isalnum() clearly did not use it.
So for example character "ä" was written to .dae as is, rather than converted to %e4, generated .dae was unreadable to many parsers.
pull/736/head
Stepan Hrbek 2015-12-31 03:22:25 +01:00
parent 15d84825d9
commit 39ab716e11
2 changed files with 7 additions and 3 deletions

View File

@ -93,7 +93,8 @@ void ExportSceneCollada(const char* pFile, IOSystem* pIOSystem, const aiScene* p
ColladaExporter::ColladaExporter( const aiScene* pScene, IOSystem* pIOSystem, const std::string& path, const std::string& file) : mIOSystem(pIOSystem), mPath(path), mFile(file) ColladaExporter::ColladaExporter( const aiScene* pScene, IOSystem* pIOSystem, const std::string& path, const std::string& file) : mIOSystem(pIOSystem), mPath(path), mFile(file)
{ {
// make sure that all formatting happens using the standard, C locale and not the user's current locale // make sure that all formatting happens using the standard, C locale and not the user's current locale
mOutput.imbue( std::locale("C") ); clocale = std::locale("C");
mOutput.imbue( clocale );
mScene = pScene; mScene = pScene;
mSceneOwned = false; mSceneOwned = false;
@ -540,7 +541,7 @@ void ColladaExporter::WriteImageEntry( const Surface& pSurface, const std::strin
std::stringstream imageUrlEncoded; std::stringstream imageUrlEncoded;
for( std::string::const_iterator it = pSurface.texture.begin(); it != pSurface.texture.end(); ++it ) for( std::string::const_iterator it = pSurface.texture.begin(); it != pSurface.texture.end(); ++it )
{ {
if( isalnum( (unsigned char) *it) || *it == '_' || *it == '.' || *it == '/' || *it == '\\' ) if( isalnum( (unsigned char) *it, clocale) || *it == '_' || *it == '.' || *it == '/' || *it == '\\' )
imageUrlEncoded << *it; imageUrlEncoded << *it;
else else
imageUrlEncoded << '%' << std::hex << size_t( (unsigned char) *it) << std::dec; imageUrlEncoded << '%' << std::hex << size_t( (unsigned char) *it) << std::dec;
@ -633,7 +634,7 @@ void ColladaExporter::WriteMaterials()
for( std::string::iterator it = materials[a].name.begin(); it != materials[a].name.end(); ++it ) { for( std::string::iterator it = materials[a].name.begin(); it != materials[a].name.end(); ++it ) {
// isalnum on MSVC asserts for code points outside [0,255]. Thus prevent unwanted promotion // isalnum on MSVC asserts for code points outside [0,255]. Thus prevent unwanted promotion
// of char to signed int and take the unsigned char value. // of char to signed int and take the unsigned char value.
if( !isalnum( static_cast<uint8_t>(*it) ) ) { if( !isalnum( static_cast<uint8_t>(*it), clocale ) ) {
*it = '_'; *it = '_';
} }
} }

View File

@ -130,6 +130,9 @@ public:
std::stringstream mOutput; std::stringstream mOutput;
protected: protected:
/// C locale
std::locale clocale;
/// The IOSystem for output /// The IOSystem for output
IOSystem* mIOSystem; IOSystem* mIOSystem;