2009-04-24 16 views
10

私はCCのためのunicode hello world?

#include <wchar.h> 
int main() 
{ 
    fwprintf(stdout, L"안, 蠀, ☃\n"); 
    return 0; 
} 

出力があるから☃、안、蠀のような出力のものにしようとしていますか?、?、?

これらの文字を印刷するにはどうすればよいですか?

編集:

#include <wchar.h> 
#include <locale.h> 
int main() 
{ 
    setlocale(LC_CTYPE, ""); 
    fwprintf(stdout, L"안, 蠀, ☃\n"); 
    return 0; 
} 

これはトリックをしました。出力は、蠀、isです。中国語の文字と雪だるまは、私がそれらのロケールを有効にしなかったためおそらく私のurxvtにボックスとして表示されます。

$ locale -a 
C 
en_US 
en_US.iso88591 
en_US.iso885915 
en_US.utf8 
ja_JP.utf8 
ko_KR 
ko_KR.euckr 
ko_KR.utf8 
korean 
korean.euc 
POSIX 
zh_CN.utf8 

中国語の文字と雪だるまが表示されるようにロケールを追加する必要がありますか?多分私はフォントが必要でしょうか?

上記のプログラムはWindowsで動作しますか?

+0

WindowsまたはLinuxをお使いですか? – Zifre

+0

まあ、私もそれらを参照してください何か私のコンピュータに間違っていますか?コードサンプルで! – alvatar

+4

エンコードをUnicode(UTF-8)に設定してみてください(Firefoxでは、表示 - >文字エンコーディング) –

答えて

1

これらの文字を受け入れるようにシステムを設定する必要があります。あなたは何を使っていますか? Windows、Linux?

+0

私はlinuxを使用しています。 $ locale すべてen_US.utf8に設定されています – numeric

9

出力端子をUnicode互換に設定する必要があります。

$ LANG=en.UTF-8 

をしても、あなたの端末エミュレータは、実際にUnicodeを表示することができますし、そうするように設定されていることを確認してください:

Linux上で(bashのシェルで)、してみてください。

4

C wchar_tを次のように定義される。

タイプwchar_tは、その値がサポートされているロケール(22.1.1)のうち指定された最大の拡張文字セットのすべてのメンバーのための個別のコードを表すことができる特殊タイプです。 [...]

マルチバイト文字とwchar_tの違い:UTF-8、UTF-:指定された文字は、(例えばエンコーディングに依存するため、複数のバイトを必要とするかもしれない

マルチバイト文字16)

wchar_t一方、すなわちSIZ固定サイズを有します実装定義のeof(wchar_t)。この幅は、wchar_tがサポートできるエンコーディングを定義することに注意してください。したがって、sizeof(wchar_t) == 2の場合、UTF-32エンコーディングを使用する方法はありません。

また、wchar_tは、それ自身でエンコーディングの感覚を持っていません。まず、wchar_tデータにどのようなエンコーディングを使用するのかをコンパイラに伝えなければなりません。誤った出力は、文字がデフォルトのエンコーディングで処理されているために、これらの文字を適切にサポートできず、一致しないと 'notdef'スタイル '?'になるためです。出力。

+0

wchar_tは必ずしもマルチバイトである必要はありません.1バイトの長さにすることができます。 –

+0

さて、私はより賢明だったはずです:-) – dirkgently

6

ユニコード出力を取得するプロセスには多くの段階があります。これらの段階はすべて正しく構成する必要があります。

まず、ユニコードサポートを有効にしてコンパイルしていますか? Windowsで実行する必要があります(-D UNICODE -D __UNICODE)。

第2に、原則として両方のコードをサポートするコマンドラインに出ていますが、発光している文字のグリフを含むフォントもありますか?

第3に、コンパイラとコマンドラインで使用されるユニコードエンコードは一致していますか?あなたのコマンドラインがUTF8を予期しているときにバイナリでUCS2を使用することは役に立たない。

この権利を得るには、基本的にUnicodeとそのエンコーディングを理解する必要があります。それが簡単であると想像したり、基本的な概念をすべて習得する必要はありません。正確に正しいものでなければならないものが多すぎるため、この事はうまく動作しません。

0

Alnitakが示唆したように、表示する文字を含む文字セット/エンコーディングでロケールを指定する必要があります。 (Unicode /)UTF-8はすべてのUnicode文字をカバーする必要があります。

端末では、それぞれのグリフを持つフォントを使用する必要があります。

Windows 'CMD.EXEは、8ビットを超える文字セットの場合、悪名高いです。おそらく、stdoutに頼るのではなく、GUIペインが必要になるでしょう。