0

ここで、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 の問題を示しています 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をご覧ください。

4

2 に答える 2

3

これはすべて、qtcreator、urxvt、gdb など、さまざまなプログラムで使用されるエンコーディングに依存します。

asciiすべての ascii のみのファイルは既に utf-8 でエンコードされているため、 からへの変換はutf-8意味がありません。最初の 127 文字の utf-8 文字は、127 文字の us-ascii 文字と同じです。

std::string s("Mäx");gdbで見ると、

(gdb) ps
$1 = {static npos = <optimized out>,
_M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<データフィールドなし>}, <データなしfields>}, _M_p = 0x602028 "Mäx"}}

あなたの最後の例、

# しかし、インデックス 1 の要素は次のようになります: "Mäx"

utf-8 では 2 バイト文字の8 進数iso-8859-1であるため、出力が using であることを示しています。これは、それぞれで確認できます。ä303 244man iso-8859-1

したがって、さまざまなプログラムで異なる出力が表示される場合、これはそれらが異なるエンコーディングを使用していることを意味します。

urxvt と qtcreator という 2 つのプログラムが関係しています。

このメッセージQtCreator and UTF-8によると、qtcreator の場合、プロジェクトの設定でエンコーディングを設定する必要があります。

urxvt については、環境が原因のようです。LANG=de_DE.UTF-8UTF-8 文字列で正常に動作するを設定しました。ただし、urxvtを次のように起動すると

LANG=de_DE urxvt

出力またはgdbのMäxように UTF-8 文字列が表示されます。Mäx"M\303\244x

urxvt を起動すると、さまざまな動作をテストできます。

LANG=en_US.UTF-8 urxvt

また

LANG=en_US urxvt

それぞれの出力を比較します。

更新

プレーン C 文字列の表示は、右クリックargv[1]->「表示形式の変更」->「UTF-8 文字列」で変更できます。

std::string表示用に、はM=\xデバッグ ヘルパーから取得されます。「ツール」->「オプション」->「デバッガ」->「デバッグ ヘルパー」でデバッグ ヘルパーを無効にしました。次に、の個々のメンバーを確認し、UTF-8 文字列も表示するようにstd::string変更できます。_M_p

于 2013-02-10T19:37:38.357 に答える
0

main の 2 番目の引数として wchar_t** を使用するだけです。

于 2013-02-11T03:43:10.213 に答える