Meu servidor Nginx não exibe corretamente conteúdo com caracteres acentuados em nomes de arquivos

Meu servidor Nginx não exibe corretamente conteúdo com caracteres acentuados em nomes de arquivos

Acabei de criar um novo servidor web usando uma máquina Linux e NginX. Parece estar funcionando corretamente para a maior parte do conteúdo.

Acabei de converter um site que costumava estar em uma caixa do Windows Server e na maior parte o conteúdo e a funcionalidade (HTML e JavaScript) foram transferidos ok. No entanto, descobri que o NginX parece ter problemas com nomes de imagens (talvez outros arquivos também ??) que contêm caracteres acentuados, por exemplo é, è, ô, etc.

Se houvesse apenas um punhado, eu poderia renomear manualmente os arquivos, mas existem centenas (talvez milhares) que tornam um processo manual impraticável. Alguém pode oferecer uma maneira de renomear facilmente arquivos com esses caracteres acentuados?

Obrigado..RDK

editar: A conversão original do site antigo tinha muitas páginas usando "windows-1252" e algumas usando "UTF-8" para o "charset". O último teve problemas ao exibir o conteúdo da página para caracteres especiais, geralmente como "diamante negro?" símbolo. O outro parecia ter problemas com JavaScript e também alguns problemas de exibição. Após uma pesquisa na web sobre esse problema, alterei todos os valores "charset =" para "iso-8859-1", que é o padrão para muitos navegadores que corrigiram todos esses problemas. Mas agora tenho problemas com caracteres especiais em nomes de arquivos ...

Responder1

Uma maneira de remover diacríticos com umPerlrename:

se você precisar renomeardiacríticospara equivalente ascii:

rename -u utf8 '
    BEGIN{use Text::Undiacritic qw(undiacritic)}
    s/.*/undiacritic($&)/e
' éééé.txt 
rename(éééé.txt, eeee.txt)

Uma outra maneira é usar odesintoxicaçãoUtilitário. Disponível com Debian/Ubuntu e outras distros como um pacote.


Outra última maneira é usar este script, baseado emconvmv(1)traduzido em inglês de um projeto francês: forum.ubuntu-fr.org:

O objetivo é alterar o conjunto de caracteres errado para utf8. (Não é um roteiro meu, masLapogne71), poderia ser um solucionador de problemas.

#!/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

Responder2

Você precisa abrir cada arquivo com Notepad++, Sublime, VSCode ou algum outro editor de texto que suporte a troca de conjunto de caracteres. Mude o conjunto de caracteres para UTF-8 e salve o arquivo. Se você estiver editando os arquivos diretamente no Linux, considere usaríconevpara converter cada arquivo para codificação UTF-8.

Depois de converter todos os seus arquivos baseados em texto para o conjunto de caracteres UTF-8, teste o nginx e os caracteres deverão ser exibidos. Caso contrário, você também pode tentar (em nginx.confqualquer .confarquivo que tenha a configuração do seu servidor) adicionar esta linha:

charset UTF-8;


Os arquivos e o servidor web devem ter o mesmo conjunto de caracteres, portanto, converter tudo para UTF-8 é a maneira mais simples de evitar esses problemas no futuro.

informação relacionada