2

curlで取得したWebサイトの出力を、データベース挿入用のutf8に変換したいと思います。

使用例:

html="$(curl -iL -compressed "$link")"

##code needed to convert nonUTF8 $html to utf8, preferably without writing to file

## escape characters for insert
html_q="${html//'\'/\\\\}"
html_q="${html_q//"'"/\'}"

## the insert statement
sqlHtml='INSERT INTO `'"${tableHtml}"'` (`html`) VALUES ('"'${html_q}'"');'
mysql -u$dbUser -p$dbPass -h$dbHost -P$dbPort -D$dbName --default_character_set utf8 -A <<ENDofMESSAGE
${sqlHtml}
ENDofMESSAGE
4

3 に答える 3

8

短い質問、短い答え:

man iconv

ここで、もう 1 つの問題があります。それは、Web ページのソース エンコーディングを特定することです。(ヒント: Google で charsetdetector と入力してください)

于 2012-07-17T14:37:45.823 に答える
0

これが私が行った解決策です:

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

デフォルトは w3c の推奨事項です
100% 正確ではありませんが、高速で、99% の確率で機能します。

同じ状況の誰かに役立つことを願っています。
また、答えてくれたすべてに感謝します。

于 2012-07-18T12:03:33.113 に答える
0

一般的なケースでは、パーサーなしでは正しく実行できません。スクリプトはそれをカットしません。ページを保存することが目的の場合は、ページをバイナリとして扱い、圧縮して印刷可能な形式に変換します。

于 2012-07-17T21:16:44.993 に答える