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符号化方式で経路を復号する.パスに中国語が含まれていない場合、まだ影響はありませんが、パスに中国語が含まれている場合、ファイル名に中国語が含まれている場合も、ターゲットフォルダパスに中国語が含まれている場合も、上記のパスが正しく認識されないという問題が発生します.次のように変更します.
ここでは、ファイルのアップロードを例として、アップロード中に、パスに関するコードはQURLにターゲットファイルパスを設定し、元のコードが次のように仮定する.
このコードは、新しい文書ドキュメント.txtファイルをクライアントからサーバルートディレクトリの下のサブフォルダ「新しいフォルダ」にアップロードすることを目的としています.元のファイル名とターゲットパスに中国語が含まれているため、上記のコードを直接使用するとエラーが発生します.次のように変更します.
符号化の問題かと思いきや、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));