Voici la solution que je suis allé pour:
#!/bin/bash
result="$({ stdout="$(curl -Lsv -compressed "$1")" ; } 2>&1; echo "--SePaRaToR--"; echo "$stdout")";
echo '
found:'
echo "$result" | grep -o '\(charset\|encoding\)[ ]*=[ ]*["]*[a-zA-Z0-9_: -]*'
echo ' '
status=1
charset="ISO_8859-1" #set default
# 1: HTTP Content-Type: header
# 2: <meta> element in the page
# 3: <xml> element in the page
regex='.*(charset|encoding)\s*=\s*["]*([a-zA-Z0-9_: -]*)'
if [[ "$result" =~ $regex ]]
then
charset="${BASH_REMATCH[2]}"
status=2
echo "match succes: $charset"
else
echo "match fail: $charset : ${BASH_REMATCH[2]}"
fi
if [[ "$charset" == *utf-8* || "$charset" == *UTF-8* ]]
then
charset='NotModified'
else
echo "iconv '$charset' to UTF-8//TRANSLIT"
html=$(echo "$result" | iconv -f"$charset" -t'UTF-8//TRANSLIT')
if [ $? -ne 0 ]
then
echo "translit failed : iconv '$charset' to UTF-8//IGNORE"
html=$(echo "$result" | iconv -f"$charset" -t"UTF-8//IGNORE")
if [ $? -ne 0 ]
then
charset="ISO_8859-1"
echo "ignore failed : iconv '$charset' to UTF-8//IGNORE"
html=$(echo "$result" | iconv -f"$charset" -t"UTF-8//IGNORE")
status=4
fi
status=3
fi
fi
echo "charset: '$charset' , status: '$status'"
La valeur par défaut est le w3c recomandation.
Ce n'est pas 100% précis mais c'est rapide et il fera son travail 99% du temps.
Espérons que cela aide quelqu'un dans la même situation.
Merci aussi à tous ceux qui ont répondu.
Comment vous attendez-vous à déterminer quel est le jeu de caractères des données dans '$ html'? Vous ne pouvez pas convertir les déchets aléatoires en UTF-8 et vous attendre à ce que le résultat soit raisonnable, vous devez savoir de quel jeu de caractères vous convertissez. – cdhowie
probablement en utilisant l'en-tête de curl, comme http://stackoverflow.com/questions/2510868/php-convert-curl-exec-output-to-utf8 –
Eh bien, c'est bash et pas PHP. Je ne suis pas sûr que le client de ligne de commande curl vous donne un accès facile à cet en-tête. Vous pourriez envisager d'écrire ceci en Python - voir [cette réponse] (http://stackoverflow.com/a/3683863/501250) pour une solution possible. – cdhowie