ここで、x64 ArchLinux を実行している QTCreator に重大な問題があります。ドイツ語のウムラウトを含むコマンドライン パラメータは無効です。それらを std::string に変換したいと思います。これは可能なはずです。少なくとも、これについて読むことができたのはこれだけです。
std::string arg(argv[1]);
// do something with arg
デバッガーを使用して変数を調べると、多少エスケープされた文字列が表示されます。たとえば、ä は「=\」になります。しかし、もし私が
std::cout << arg << std::endl;
変数は私のコンソール (urxvt) ではまったく問題ありません。
QtCreator のエディター設定 (これまで触れたことはありません) を確認したところ、UTF-8 を使用していると書かれています。コメントにウムラウトをいくつか追加して実行した後、ソースファイルをUTF-8に変換しました
% iconv -f ascii -t utf-8 main.cpp > _main.cpp
% mv _main.cpp main.cpp
# qtcreator recognized the change and ask me to reload the file, what I did
% file -bi main.cpp
# then results text/x-c; charset=utf-8, was text/x-c; charset=us-ascii before
何も機能しませんでした。ウムラウトを含む std::string を定義することさえできません:
std::string s("Mäx");
// the GDB debugger show 's' as: M=\x
次に、.pro ファイル内から UNICODE を定義しました
DEFINES += UNICODE
# also without success
さらに不可解なことに、次の場合は別の効果があります。
std::vector< std::string > list(argv, argv + argc);
# the debugger shows 2 elements (which is correct)
# but the element at index 1 looks like this: "Mäx"
私はまったく無力です。多分誰かが助けることができます。ありがとう
@オラフ:
// lacks sanity checks but good enough for testing
std::wstring Encoding::char2Wide(const char *chars) {
setlocale(LC_ALL, "");
// get the length of the string to convert
int len = mbstowcs(NULL, chars, 0) + 1;
wchar_t* result = new wchar_t[len];
len = mbstowcs(result, chars, len);
std::wstring s(result);
return s;
}
2013年2月11日
少し明確にするために、この図は std::string の問題を示しています
コンソールへの出力は問題ではありません。全然大丈夫です。ここに私のロケール設定があります
% locale
LANG=de_DE.UTF-8
LC_CTYPE="de_DE.UTF-8"
LC_NUMERIC="de_DE.UTF-8"
LC_TIME="de_DE.UTF-8"
LC_COLLATE="de_DE.UTF-8"
LC_MONETARY="de_DE.UTF-8"
LC_MESSAGES="de_DE.UTF-8"
LC_PAPER="de_DE.UTF-8"
LC_NAME="de_DE.UTF-8"
LC_ADDRESS="de_DE.UTF-8"
LC_TELEPHONE="de_DE.UTF-8"
LC_MEASUREMENT="de_DE.UTF-8"
LC_IDENTIFICATION="de_DE.UTF-8"
LC_ALL=
ハハ:
if ( s == "Mäx" ) std::cout << "Yeahhh" << endl;
-> Yeahhh (what the fxxx!)
たぶん、これは qtcreator の問題だけです。今日、ビジュアルスタジオでこの簡単な例を試してみましたが、すべて期待どおりに進みました. そして、まあ、Linux でも Eclipse CDT を使用して期待どおりに動作します。GDB は適切な値を示します。バグを報告すると思います。
アップデート
正解については、https://stackoverflow.com/a/14801772/76591をご覧ください。