QTの中でFTPの中国語の文字化けして解決します



FTPサーバはListコマンドを受信すると,現在のフォルダのすべての項目(フォルダとファイルの名前,サイズ,時間,所有者などの関連情報を含む)を列挙してFTPクライアントに返す.「ftpは符号化の問題でかなり不器用で、符号化について何も知らないほど愚かだ」という言葉をネットで見たことがある.確かに、多くのFTPサーバがこれらの名前を返す際に採用する文字符号化フォーマットはANSIである.これはあまりよくないフォーマットで、英語の文字は1バイトの記憶空間を占有して、非英語の文字は2バイトの記憶空間を占有して、長さは一致しません.Qtのデフォルトテキスト符号化にはUTF-16が用いられている(そうですか?ここではよくわかりませんが、どうせ実験で得られたデータから見れば少なくともそうです).すなわち、各文字が2バイトの記憶領域を占める.QFtpがFTPサーバから現在のディレクトリの項目情報を取得すると、名称部分は直接乱暴にUTF-16形式に分割され、これらのデータがUTF-16形式のデータであると考えられる.では、もちろんどのように変換しても、データ自体が間違っていて、どのようにして正しい中国語の表示を得ることができますか?そのため、これらのデータを特別に整理する必要があります.
 
符号化エラーのため,相互変換符号化のために2つの関数を書いた.
 
一つは正常符号化からQFTP上のいわゆる「乱符号化」に移行した:QString_ToSpecialEncoding(const QString &InputStr);
もう1つはQFTP乱符号から通常符号化に変換された:QString_FromSpecialEncoding(const QString &InputStr);
 
注意しなければならないのは、この関数を使用する前に、あなたのアプリケーションはインタフェースに中国語を正常に表示できるはずです.私はこのように実現しました.
まず,コードスパンプラットフォームを考慮し,主にLinuxプラットフォームの下で実行する.したがって、QtCreatorのファイルはUTF-8としてデフォルトでエンコードされます.
つまり工事中です.cppと.hファイル内部文字符号化フォーマットはUTF-8である.
そしてプロジェクトのmain関数でQLPplication app...次の行には、次のコードを書きます.
 
    QTextCodec::setCodecForCStrings(QTextCodec::codecForName("utf8"));
#ifdef Q_OS_WIN
    QTextCodec::setCodecForLocale(QTextCodec::codecForName("gbk"));
#else
    QTextCodec::setCodecForLocale(QTextCodec::codecForName("utf8"));
#endif
    QTextCodec::setCodecForTr(QTextCodec::codecForName("utf8"));

 
Windowsのローカルデフォルト符号化はgbk(中国語システムを使用している場合)、Linuxのローカルデフォルト符号化はUTF-8であることに注意してください.
そのため、異なるオペレーティングシステムに基づいて設定します.LinuxシステムとMacシステムのデフォルトコードはUTF-8なので、上記のコードではこの2つのオペレーティングシステムを区別していません.
 
変換関数の実装:
[cpp]
view plain
copy
QString FTPCommunicator::_FromSpecialEncoding(const QString &InputStr)  
{  
#ifdef Q_OS_WIN  
    return  QString::fromLocal8Bit(InputStr.toLatin1());  
#else  
    QTextCodec *codec = QTextCodec::codecForName("gbk");  
    if (codec)  
    {  
        return codec->toUnicode(InputStr.toLatin1());  
    }  
    else  
    {  
        return QString("");  
    }  
#endif  
}  
 
[cpp] 
view plain
copy
QString FTPCommunicator::_ToSpecialEncoding(const QString &InputStr)  
{  
#ifdef Q_OS_WIN  
    return QString::fromLatin1(InputStr.toLocal8Bit());  
#else  
    QTextCodec *codec= QTextCodec::codecForName("gbk");  
    if (codec)  
    {  
        return QString::fromLatin1(codec->fromUnicode(InputStr));  
    }  
    else  
    {  
        return QString("");  
    }  
#endif  
}  
QFTPのputメソッドを使用してアップロードすると、ターゲットファイル名パラメータの位置が_ToSpecialEncoding(通常符号化文字列);
QFTPのgetメソッドを使用してダウンロードする場合、ターゲットファイル名パラメータ位置も上記の関数を使用します.
QFTP遍歴したファイルをローカルファイル名として使用する場合は_FromSpecialEncoding(誤符号化文字列);