@@ -418,19 +418,40 @@ def ParseTags(self, template, replacements, lang=None):
418418 if '&' in repl :
419419 parts [i ] = repl
420420 else :
421- repl = repl .encode (charset , 'replace' )
421+ # Ensure proper encoding/decoding
422+ try :
423+ # First try to decode if it's already encoded
424+ if isinstance (repl , bytes ):
425+ repl = repl .decode (charset , 'replace' )
426+ # Then encode and decode to ensure proper charset
427+ repl = repl .encode (charset , 'replace' ).decode (charset , 'replace' )
428+ parts [i ] = repl
429+ except (UnicodeError , LookupError ):
430+ # Fallback to utf-8 if charset fails
431+ repl = repl .encode ('utf-8' , 'replace' ).decode ('utf-8' , 'replace' )
432+ parts [i ] = repl
433+ elif isinstance (repl , bytes ):
434+ try :
422435 repl = repl .decode (charset , 'replace' )
423436 parts [i ] = repl
424- elif isinstance ( repl , bytes ):
425- repl = repl .decode (charset , 'replace' )
426- parts [i ] = repl
437+ except ( UnicodeError , LookupError ):
438+ repl = repl .decode ('utf-8' , 'replace' )
439+ parts [i ] = repl
427440 else :
428441 parts [i ] = str (repl )
429442 else :
430443 parts [i ] = ''
431444 i = i + 2
432445
433- return EMPTYSTRING .join (parts )
446+ # Join parts and ensure proper encoding
447+ result = EMPTYSTRING .join (parts )
448+ try :
449+ # Ensure the final output is properly encoded
450+ if isinstance (result , bytes ):
451+ result = result .decode (charset , 'replace' )
452+ return result
453+ except (UnicodeError , LookupError ):
454+ return result .decode ('utf-8' , 'replace' )
434455
435456 def GetStandardReplacements (self , lang = None , replacements = None ):
436457 """Get the standard replacements for this list."""
0 commit comments