Kaynağa Gözat

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.
Stepan Hrbek 9 yıl önce
ebeveyn
işleme
39ab716e11
2 değiştirilmiş dosya ile 7 ekleme ve 3 silme
  1. 4 3
      code/ColladaExporter.cpp
  2. 3 0
      code/ColladaExporter.h

+ 4 - 3
code/ColladaExporter.cpp

@@ -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)
 {
     // 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;
     mSceneOwned = false;
@@ -540,7 +541,7 @@ void ColladaExporter::WriteImageEntry( const Surface& pSurface, const std::strin
     std::stringstream imageUrlEncoded;
     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;
       else
         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 ) {
         // 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.
-      if( !isalnum( static_cast<uint8_t>(*it) ) ) {
+      if( !isalnum( static_cast<uint8_t>(*it), clocale ) ) {
         *it = '_';
       }
     }

+ 3 - 0
code/ColladaExporter.h

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