Merge pull request #736 from StepanHrbek/collada-unicode

Collada exporter: fix unicode.
pull/756/head
Kim Kulling 2016-01-19 16:35:48 +01:00
commit ded37e8307
1 changed files with 9 additions and 4 deletions

View File

@ -526,6 +526,13 @@ void ColladaExporter::ReadMaterialSurface( Surface& poSurface, const aiMaterial*
} }
} }
// ------------------------------------------------------------------------------------------------
// Reimplementation of isalnum(,C locale), because AppVeyor does not see standard version.
static bool isalnum_C(char c)
{
return strchr("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",c);
}
// ------------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------------
// Writes an image entry for the given surface // Writes an image entry for the given surface
void ColladaExporter::WriteImageEntry( const Surface& pSurface, const std::string& pNameAdd) void ColladaExporter::WriteImageEntry( const Surface& pSurface, const std::string& pNameAdd)
@ -540,7 +547,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( *it) || *it == '_' || *it == '.' || *it == '/' || *it == '\\' ) if( isalnum_C( (unsigned char) *it) || *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;
@ -631,9 +638,7 @@ void ColladaExporter::WriteMaterials()
name = "mat"; name = "mat";
materials[a].name = std::string( "m") + boost::lexical_cast<std::string> (a) + name.C_Str(); materials[a].name = std::string( "m") + boost::lexical_cast<std::string> (a) + name.C_Str();
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 if( !isalnum_C( *it ) ) {
// of char to signed int and take the unsigned char value.
if( !isalnum( static_cast<uint8_t>(*it) ) ) {
*it = '_'; *it = '_';
} }
} }