2011-02-03 33 views
1

Unicode文字をサポートするために既存のコードを変換しようとしているときに、この問題が発生しました。ユニコード文字(この場合はユーロ記号を使用しています)を* wprintf関数のいずれかに渡そうとすると失敗しますが、一見xcodeだけになります。ビジュアルスタジオでも同じコードがうまく動作し、linuxでgccを使って正常にテストするための友人を手に入れることさえできました。ここで問題のあるコードです:Visual Studioで、それは成功し、3つの文字(65、165のそれぞれについて、正しい値をプリントアウトして進める一方で、swprintfはxcodeのUnicode文字で失敗しますが、Visual Studioで動作します

wchar_t _teststring[10] = L""; 
int _iRetVal = swprintf(_teststring, 10, L"A¥€"); 

wprintf(L"return: %d\n", _iRetVal); 

// print values stored in string to check if anything got corrupted 
for (int i=0; i<wcslen(_teststring); ++i) { 
    wprintf(L"%d: (%d)\n", i, _teststring[i]); 
} 

Xcodeでswprintfへの呼び出しは-1を返します、 8364)。 、私がいない成功を収めて、この機能を引数の様々な組み合わせを試してみました

setlocale(LC_CTYPE, "UTF-8"); 

:回数を登場している

私は長いとソリューションのためのハードGoogleで検索している、1つの提案は、次のような呼び出しを使用していますさらに調査すると、デフォルトの "C"以外の値にロケールを設定しようとするとnullが返されるようです。

私はこの問題を解決するために他に何ができるかについて迷っています。他のコンパイラ/プラットフォームでもうまく動作しているだけに、もっとイライラします。どんな助けでも大歓迎です!

EDIT:あなたは、環境からロケールを取得する場合、それが動作するはず

#define EILSEQ  92  /* Illegal byte sequence */ 
+1

ソースコードを7ビットのasciiにしておき、それが役立つかどうか確認してください。 '' \ u03b2 "'を文字列に書きます。 – bobbogo

+0

喜びはありませんが、同じように失敗します。私は "A¥"で文字列を初期化して、それらがすべて正しいと読んだら、ユニコード文字で文字列を作成することは問題ではないと思います。 – Argh

答えて

1

: はちょうど私がswprintf呼び出しが失敗したときに、それはのように定義されたエラーコード(92)を設定していることを追加するだろうと思いました: GCC 4.2.1で期待通りに私のOS X 10.6上で

#include <stdio.h> 
#include <wchar.h> 
#include <locale.h> 

int main(void) { 
    setlocale(LC_ALL, ""); 
wchar_t _teststring[10] = L""; 
int _iRetVal = swprintf(_teststring, 10, L"A¥€"); 

wprintf(L"return: %d\n", _iRetVal); 

// print values stored in string to check if anything got corrupted 
for (int i=0; i<wcslen(_teststring); ++i) { 
    wprintf(L"%d: (%d)\n", i, _teststring[i]); 
} 

} 

が、これは動作しますが、打ち鳴らす1.6でコンパイルしたとき、それは結果文字列にUTF-8バイトを配置します。

これはXcode(標準のC++コンソールアプリケーションテンプレートを使用)でもコンパイルできますが、OS Xのグラフィカルアプリケーションには必要なロケール環境変数がないため、Xcodeのコンソールでは機能しません。一方、ターミナルアプリケーションでは常に動作します。

ロケールをen_US.UTF-8setlocale(LC_ALL, "en_US.UTF-8"))に設定することもできますが、これは移植性がありません。あなたの目標に応じて、より良い代替手段がwsprintfにあるかもしれません。

+0

私は、私が試した組み合わせのうちの1つであることをかなり確信しています。明日までxcodeでテストすることはできませんが、午前中はそれを実行します。 – Argh

+0

だから私はコードを行った、私はGCCと直接端末を介してコンパイルし、あなたが期待どおりに動作すると言った。しかし、以前と同じようにxcodeで失敗し続けます。私は今、疑問は、xcodeがそれを悪用することをどう管理しているのかということですね?私はこれまで、いくつかの異なるコンパイラオプションをテストしました。 – Argh

+0

@Argh:Xcodeは、グラフィカルアプリケーションとして、必要なロケール環境変数を持たないという問題があります。 Xcodeでコンパイルされたプログラムをターミナルから実行するとうまくいくはずです。 – Philipp

1

Xcode 4+を使用している場合は、文字列を含むファイルに適切なエンコーディングを設定していることを確認してください。エンコード設定は、右ペインの[テキスト設定]グループで確認できます。

1

マイクロソフトはVS 2015以降の他のコンパイラと互換性がある計画を持っていましたが、結局はレガシーコードの問題のために発生しませんでした。linkを参照してください。

幸いにも、VS2015でISO C(C99)標準を有効にするには、_CRT_STDIO_ISO_WIDE_SPECIFIERSプリプロセッサマクロを追加します。移植性のあるコードを書くときには、これはお勧めです。

関連する問題