
Ich habe gerade einen neuen Webserver mit einer Linux-Box und NginX erstellt. Für die meisten Inhalte scheint er einwandfrei zu funktionieren.
Ich habe gerade eine Site konvertiert, die sich vorher auf einem Windows Server-Rechner befand, und der größte Teil der Inhalte und Funktionen (HTML und JavaScript) wurde problemlos übertragen. Allerdings habe ich festgestellt, dass NginX anscheinend Probleme mit Bildnamen (vielleicht auch mit anderen Dateien??) hat, die Akzentzeichen enthalten, z. B. é, è, ô usw.
Wenn es nur eine Handvoll wären, könnte ich die Dateien einfach manuell umbenennen, aber es gibt Hunderte (vielleicht Tausende), was einen manuellen Vorgang unmöglich macht. Kann jemand eine Möglichkeit anbieten, Dateien mit diesen Akzentzeichen einfach umzubenennen?
Danke..RDK
Bearbeiten: Bei der ursprünglichen Konvertierung der alten Site verwendeten viele Seiten „Windows-1252“ und einige „UTF-8“ als „Zeichensatz“. Letztere hatten Probleme, Seiteninhalte für Sonderzeichen anzuzeigen, normalerweise als „schwarze Raute?“. Die andere Seite schien Probleme mit JavaScript und auch einige Anzeigeprobleme zu haben. Nach einer Websuche zu diesem Problem habe ich alle „charset=“-Werte in „iso-8859-1“ geändert, was die Standardeinstellung vieler Browser ist, wodurch alle diese Probleme behoben wurden. Aber jetzt habe ich das Problem mit den Sonderzeichen in Dateinamen …
Antwort1
Eine Möglichkeit zum Entfernen diakritischer Zeichen mit einemPerlsrename
:
wenn Sie umbenennen müssendiakritische Zeichenzum ASCII-Äquivalent:
rename -u utf8 '
BEGIN{use Text::Undiacritic qw(undiacritic)}
s/.*/undiacritic($&)/e
' éééé.txt
rename(éééé.txt, eeee.txt)
Eine andere Möglichkeit besteht darin, dieEntgiftungDienstprogramm. Als Paket mit Debian/Ubuntu und anderen Distributionen verfügbar.
Eine weitere Möglichkeit ist die Verwendung dieses Skripts, basierend aufKonvMV(1)aus einem französischen Projekt ins Englische übersetzt: forum.ubuntu-fr.org:
Es soll den falschen Zeichensatz in UTF-8 ändern. (Kein Skript von mir, aberLapogne71), könnte ein Problemlöser sein.
#!/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
Antwort2
Sie müssen jede Datei mit Notepad++, Sublime, VSCode oder einem anderen Texteditor öffnen, der das Umschalten des Zeichensatzes unterstützt. Ändern Sie den Zeichensatz in UTF-8 und speichern Sie die Datei. Wenn Sie die Dateien direkt in Linux bearbeiten, können Sie Folgendes verwenden:Symbolvum jede Datei in die UTF-8-Kodierung zu konvertieren.
Nachdem Sie alle Ihre textbasierten Dateien in den UTF-8-Zeichensatz konvertiert haben, testen Sie nginx und die Zeichen sollten angezeigt werden. Wenn nicht, können Sie auch versuchen, (in nginx.conf
oder in der .conf
Datei, die Ihre Serverkonfiguration enthält) diese Zeile hinzuzufügen:
charset UTF-8;
Die Dateien und der Webserver müssen denselben Zeichensatz haben, daher ist die Konvertierung aller Elemente in UTF-8 die einfachste Möglichkeit, diese Probleme in Zukunft zu vermeiden.