From pixukideak en gmail.com Mon Feb 19 11:39:54 2024 From: pixukideak en gmail.com (Pixu Kideak) Date: Mon, 19 Feb 2024 17:39:54 +0100 Subject: [Python-es] Codificacion de %F3 Message-ID: Buenas tardes, Tengo un problema con una codificación. Estoy tras una API realizada con FastAPI que corre sobre uvicorn. Una llamada a la api sería lo siguiente: @app.get("/actualizarv2" ,summary="Actualiza 1 cliente", description="Actualiza la información para 1 cliente (NombreCliente) en una semana (semana) determinada.") async def run_actualizar(NombreCliente: str, semana: str): try: script_path = "/home/debian/xxx/logs/API/actualizar.sh" #NombreCliente = NombreClienteDe # Validar y escapar la ruta del script script_path_escaped = shlex.quote(script_path) #Parseo de variables #NombreCliente = urllib.parse.unquote_plus(NombreCliente) NombreCliente = urllib.parse.unquote(NombreCliente, encoding='utf-8') semana = urllib.parse.quote(semana, safe='') # Crear el comando con las variables como argumentos command = [script_path_escaped, NombreCliente, semana] # Ejecutar el script de manera asíncrona process = await asyncio.create_subprocess_exec( *command, stdout=subprocess.PIPE, stderr=subprocess.PIPE ) # Esperar a que el script termine y obtener la salida y el error stdout, stderr = await process.communicate() # Decodificar la salida y el error a UTF-8 output = stdout.decode("utf-8") error = stderr.decode("utf-8") return {"output": output, "error": error} except Exception as e: return {"error": str(e)} En esa llamada realizó una llamada a actualizar.sh: #!/bin/bash # Recibir los valores de NombreCliente y semana pasados por línea de comandos export LANG=C.UTF-8 NombreCliente=$1 semana=$2 ########################################################################## FECHA=`date +"semana %V %Y-%m-%d %T"` echo "$FECHA INICIO : actualizar.sh" >> /home/debian/xxx/logs/API.log echo "$FECHA NOMBRE : $NombreCliente" >> /home/debian/xxx/logs/API.log echo "$FECHA PARAM1 : $1" >> /home/debian/xxx/logs/API.log # cambiar al directorio deseado ... Si el GET fuera similar a esto: "GET /actualizarv2?NombreCliente=Platanos+RojosSL+%28S7%2C+Libres+Paszk%F3w%29&semana=9 En el fichero API.log escribe una entrada similar a: semana 08 2024-02-19 17:19:03 INICIO : actualizar.sh semana 08 2024-02-19 17:19:03 NOMBRE : Platanos Rojos (S7, Libres Paszk?w) semana 08 2024-02-19 17:19:03 PARAM1 : Platanos Rojos (S7, Libres Paszk?w) Lo que yo deseo, es que escriba Platanos Rojos (S7, Libres Paszków). Que pueda interpretar por ejemplo ó en lugar de ? He revisado por activa y por pasiva la codificación utilizada, en el servidor el locale es: LANG=es_ES.UTF-8 por lo que entiendo que ese no debe ser el problema. Pero algo ocurre cuando paso el parámetro al script de bash que no lo coge cómo debe o lo interpreta de manera incorrecta. ¿Sabéis cúal puede ser la solución? Un saludo y gracias por vuestra colaboración, ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: