
Acabo de crear un nuevo servidor web usando una máquina Linux y NginX. Parece estar funcionando correctamente para la mayoría del contenido.
Acabo de convertir un sitio que solía estar en una caja de Windows Server y, en su mayor parte, el contenido y la funcionalidad (HTML y JavaScript) se transfirieron bien. Sin embargo, descubrí que NginX parece tener problemas con los nombres de imágenes (¿quizás también con otros archivos?) que contienen caracteres acentuados, por ejemplo é,è,ô, etc.
Si solo hubiera unos pocos, podría simplemente cambiar el nombre de los archivos manualmente, pero hay cientos (tal vez miles) que hacen que un proceso manual sea inviable. ¿Alguien puede ofrecer una manera de cambiar fácilmente el nombre de los archivos con estos caracteres acentuados?
Gracias..RDK
editar: La conversión original del sitio antiguo tenía muchas páginas que usaban "windows-1252" y algunas que usaban "UTF-8" para el "juego de caracteres". Este último tuvo problemas para mostrar el contenido de la página para caracteres especiales, generalmente como el "diamante negro". símbolo. El otro parecía tener problemas con JavaScript y también algunos problemas de visualización. Después de una búsqueda en la web sobre ese problema, cambio todos los valores "charset=" a "iso-8859-1", que es el valor predeterminado para muchos navegadores y corrigió todos esos problemas. Pero ahora tengo el problema de los caracteres especiales en los nombres de archivos...
Respuesta1
Una forma de eliminar los signos diacríticos con unPerlrename
:
si necesitas cambiar el nombresignos diacríticosal equivalente ascii:
rename -u utf8 '
BEGIN{use Text::Undiacritic qw(undiacritic)}
s/.*/undiacritic($&)/e
' éééé.txt
rename(éééé.txt, eeee.txt)
Otra forma es utilizar eldesintoxicaciónutilidad. Disponible con Debian/Ubuntu y otras distribuciones como paquete.
Otra última forma es utilizar este script, basado enconvmv(1)Traducido al inglés de un proyecto francés: foro.ubuntu-fr.org:
Su objetivo es cambiar el juego de caracteres incorrecto a utf8. (No es un guión mío, peroLapogne71), podría ser una solución al problema.
#!/bin/bash
VERSION="v0.04"
#---------------------------------------------------------------------------------------
# This script allows to loop the "convmv" utility that allows converting file names coded in
# something other than UTF-8 to UTF-8
# Restart the script with the ALLCODES argument if no result has been found
#---------------------------------------------------------------------------------------
# here are the colors of the text displayed in the shell
RED="\\033[1;31m"
NORMAL="\\033[0;39m"
BLUE="\\033[1;36m"
GREEN="\\033[1;32m"
echo
echo -e "$GREEN $0 $NORMAL $VERSION"
echo
echo "----------------------------------------------------------
This script allows to loop the 'convmv' utility that allows converting file names coded in
something other than UTF-8 to UTF-8. Restart the script with the ALLCODES argument if no result
has been found.
----------------------------------------------------------"
# The main loop launches convmv tests to "visually" detect the original encoding
# We only loop over the iso-8859* and cp* code families as they are the most likely ones (EBCDIC codes have also been removed from the list)
CODES_LIST="
iso-8859-1
iso-8859-2
iso-8859-3
iso-8859-4
iso-8859-5
iso-8859-6
iso-8859-7
iso-8859-8
iso-8859-9
iso-8859-10
iso-8859-11
iso-8859-13
iso-8859-14
iso-8859-15
iso-8859-16
cp437
cp737
cp775
cp850
cp852
cp855
cp856
cp857
cp860
cp861
cp862
cp863
cp864
cp865
cp866
cp869
cp874
cp932
cp936
cp949
cp950
cp1250
cp1251
cp1252
cp1253
cp1254
cp1255
cp1256
cp1257
cp1258
"
# We check if the convmv utility is installed
path=`which convmv 2> /dev/null`
if [ -z "$path" ]; then
echo -e "$RED ERROR: convmv is not installed, please install it by typing:"
echo
echo -e "$BLUE sudo apt-get install convmv "
echo
echo -e "$RED ==> program exit"
echo
echo -e "$NORMAL"
exit 1
fi
# To loop over all the codepages supported by convmv, the ALLCODES argument must be provided
if [ "$1" = "ALLCODES" ]; then
CODES_LIST=`convmv --list`
echo
echo -e "$RED Check which original encoding seems correct (press 'y' and validate if waiting for display)$NORMAL"
echo
fi
# Main loop of the program
for CODAGE in $CODES_LIST; do
echo -e "$BLUE--- Encoding hypothesis: $RED $CODAGE $BLUE---$NORMAL"
echo
# echo -e "$RED Press 'y' and validate if no list is displayed $NORMAL"
convmv -f $CODAGE -t utf-8 -r * 2>&1 | grep -v Perl | grep -v Starting | grep -v notest | grep -v Skipping > /tmp/affichage_convmv.txt
NOMBRE_FICHIERS=`cat /tmp/affichage_convmv.txt | wc -l`
if [ $NOMBRE_FICHIERS -eq 0 ]; then
echo
echo -e "$RED No filename to convert " $NORMAL
echo
echo -e "$BLUE Exiting program ... $NORMAL"
echo
rm /tmp/affichage_convmv.txt 2>/dev/null
exit 0
fi
# sed 's .. ' source.txt ==> this removes the first 2 characters from a string
echo -e $GREEN "Original filenames coded in $CODAGE: " $NORMAL
# ALTERNATIVE cat /tmp/affichage_convmv.txt | cut -f 2 -d '"' | sed 's .. '
cat /tmp/affichage_convmv.txt | cut -f 2 -d '"'
echo
echo -e $GREEN "Filenames converted to UTF-8: " $NORMAL
# ALTERNATIVE cat /tmp/affichage_convmv.txt | cut -f 4 -d '"' | sed 's .. '
cat /tmp/affichage_convmv.txt | cut -f 4 -d '"'
echo
echo -n -e $GREEN "Found encoding? $RED [N]$NORMAL""on /$RED o$NORMAL""ui /$RED q$NORMAL""uit: "
read confirm
echo
# request for file conversion using convmv
if [ "$confirm" = O ] || [ "$confirm" = o ];then
echo -e "$BLUE Convert filenames now from encoding $CODAGE? $NORMAL"
echo -e "$BLUE ==> convmv -f $CODAGE -t utf-8 * --notest $NORMAL"
echo -n -e $GREEN "Confirm conversion $RED [N]$NORMAL""on /$RED o$NORMAL""ui /$RED r$NORMAL""ecursive: "
read confirm
echo
case $confirm in
O|o) convmv -f $CODAGE -t utf-8 * --notest 2>/dev/null
echo
echo -e "$BLUE File name conversion done... $NORMAL" ;;
R|r) convmv -f $CODAGE -t utf-8 * -r --notest 2>/dev/null
echo
echo -e "$BLUE Recursive file name conversion done... $NORMAL" ;;
*) echo -e "$BLUE Exiting program... $NORMAL" ;;
esac
echo
rm /tmp/affichage_convmv.txt 2>/dev/null
exit 0
# request for program exit
elif [ "$confirm" = Q ] || [ "$confirm" = q ];then
echo -e "$BLUE Exiting program... $NORMAL"
echo
rm /tmp/affichage_convmv.txt 2>/dev/null
exit 0
fi
clear
done
rm /tmp/affichage_convmv.txt 2>/dev/null
Respuesta2
Debe abrir cada archivo con Notepad++, Sublime, VSCode o algún otro editor de texto que admita el cambio de juego de caracteres. Cambie el juego de caracteres a UTF-8 y luego guarde el archivo. Si está editando los archivos directamente en Linux, podría considerar usariconovpara convertir cada archivo a codificación UTF-8.
Luego, después de haber convertido todos sus archivos basados en texto al juego de caracteres UTF-8, pruebe nginx y deberían aparecer los caracteres. De lo contrario, también puede intentar (en nginx.conf
el .conf
archivo que tenga la configuración de su servidor) agregar esta línea:
charset UTF-8;
Los archivos y el servidor web deben tener el mismo conjunto de caracteres, por lo que convertir todo a UTF-8 es la forma más sencilla de evitar estos problemas en el futuro.