QTがFTPを使用してファイルを転送する際の中国語パスの問題

2322 ワード

最近、FTPファイル転送に関する項目があるので、関連資料を照会してサンプルプログラムを作成しました.プログラムは正常に動作していますが、テスト中に中国語を含むファイルを使用してテストを行うと、プログラムがエラーを報告します.
符号化の問題かと思いきや、FTPはUTF-8符号化を認識していないと考えられていたので、FTPのコンフィギュレーション項目で問い合わせると、UTFビンに対してサポートされていることがわかりました.後で関連資料の検索を続けます.問題点が見つかった.(参照可能http://blog.sina.com.cn/s/blog_a0d5a7f101019hjd.html)
Windowsのローカルデフォルトコードはgbk(中国語システムを使用している場合)、LinuxのローカルデフォルトコードはUTF-8です.我々が現在使用しているQT符号化は一般にUTF−8に設定されているので,FTPサーバはファイル転送時にgbk符号化方式で経路を復号する.パスに中国語が含まれていない場合、まだ影響はありませんが、パスに中国語が含まれている場合、ファイル名に中国語が含まれている場合も、ターゲットフォルダパスに中国語が含まれている場合も、上記のパスが正しく認識されないという問題が発生します.次のように変更します.
// gbk        UTF-8  ,   FTP         
QString 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  
}  
// UTF-8        gbk  ,               
QString 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  
}  

ここでは、ファイルのアップロードを例として、アップロード中に、パスに関するコードはQURLにターゲットファイルパスを設定し、元のコードが次のように仮定する.
QUrl url;
//      
url.setScheme("ftp");
//     
url.setUserName("user");
//    
url.setPassword("pwd");
//    ,      
url.setHost("192.168.1.1");
//     ,   21
url.setPort(21);
//    
QString path="\\     \\      .txt";
url.setPath(path);

このコードは、新しい文書ドキュメント.txtファイルをクライアントからサーバルートディレクトリの下のサブフォルダ「新しいフォルダ」にアップロードすることを目的としています.元のファイル名とターゲットパスに中国語が含まれているため、上記のコードを直接使用するとエラーが発生します.次のように変更します.
QUrl url;
//      
url.setScheme("ftp");
//     
url.setUserName("user");
//    
url.setPassword("pwd");
//    ,      
url.setHost("192.168.1.1");
//     ,   21
url.setPort(21);
//    
QString path="\\     \\      .txt";
url.setPath(ToSpecialEncoding(path));