/ / ExpatError: no está bien formado (token no válido) al usar SimpleXMLRPCServer causado por caracteres diacríticos - python, simplexmlrpcserver

ExpatError: no bien formado (token inválido) cuando se usa SimpleXMLRPCServer causado por caracteres diacríticos - python, simplexmlrpcserver

Me tomó mucho tiempo para identificar algunos específicoscausa del error. Estoy escribiendo un servidor XML RPC simple que le permite la lista de directorios y posiblemente otras operaciones de solo lectura. Ya hice un método simple para enumerar todas las carpetas y archivos y representarlos como diccionario:

def list_dir(self, dirname):
"""Returns list of files and directories as a dictionary, where key is name and values is either "file" or "dir""""
dirname = os.path.abspath(os.path.join(self.server.cwd,dirname))
#Check that the path doesn"t lead above
if dirname.find(self.server.cwd)==-1:
raise SecurityError("There was an attempt to browse in %s wthich is above the root working directory %s."%(dirname, self.server.cwd))
check_for_valid_directory(dirname)
#Looping through directory
files = [i for i in os.listdir(dirname)]
#Create associative array
result = {}
#Iterate through files
for f in files:
fullpath = os.path.join(dirname, f)
#Appending directories
if os.path.isdir(fullpath):
result[f] = "dir"
else:
result[f] = "file"

print "Sending data", result
return result

Ahora cuando el directorio contiene el archivo (o más bien la carpeta) nombrado Nová složka el cliente recibe el error en lugar de la lista deseada. Cuando quité el nombre de archivo problemático recibí datos sin errores. No creo que la biblioteca de Python tenga este derecho, ya sea que la conversión del argumento debería estar completa, incluido cualquier elemento de Unicode, o no estar presente en absoluto.

Pero de todos modos, ¿cómo debo codificar la biblioteca de datos de Python que no puedo manejar?

Respuestas

1 para la respuesta № 1

Tienes que asegurarte de que los nombres de archivo y las rutas seanobjetos Unicode y que todos los nombres de archivos utilizan la codificación correcta. La última parte puede ser un poco complicada, ya que los nombres de archivo POSIX son cadenas de bytes y no hay ningún requisito de que todos los nombres de archivo de una partición tengan que estar codificados con la misma codificación. En ese caso, no hay mucho que puedas hacer aparte de decodificar los nombres por ti mismo y manejar los errores de alguna manera o devolver los nombres de archivo como datos binarios en lugar de cadenas (unicode).

Las funciones relacionadas con el nombre de archivo en os y os.path devuelve cadenas Unicode si obtienen cadenas Unicode como argumentos. Así que si te aseguras de que dirname es de tipo unicode en lugar de str entonces os.listdir() devolverá cadenas Unicode que deberían poder transmitirse a través de XML-RPC.