2011-09-21 8 views
7

私はwchar_t *文字列を出力しようとしています。 次のコードは行く:char vs wchar_t

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

char *ascii_ = "中日友好"; //line-1 
wchar_t *wchar_ = L"中日友好"; //line-2 

int main() 
{ 
    printf("ascii_: %s\n", ascii_); //line-3 
    wprintf(L"wchar_: %s\n", wchar_); //line-4 
    return 0; 
} 

//Output 
ascii_: 中日友好 

質問:

  1. は、どうやら私はライン-1で*ポインタをcharにCJK文字を割り当てるべきではありませんが、私はちょうどそれをしなかった、とラインの出力-3は正しいです、なぜですか? 3行目のprintf()は私に非ASCII文字を与えることができますか?何とかエンコーディングを知っていますか?

  2. 2行目と4行目のコードは正しいと思いますが、なぜ4行目の出力が得られなかったのですか?

+0

どのコンパイラを使用していますか? GCCのデフォルトは、ほとんどのプラットフォームでUtf-8です。私にエンコードの問題のようです。 – cyco130

+0

@ cyco130、はい、gcc – Alcott

答えて

8

まず、ソースコードに非ASCII文字を使用することは、通常はお勧めできません。おそらく起こっているのは、中国語の文字がasciiで動作するUTF-8としてエンコードされているということです。

今、なぜwprintf()が機能していないのかについて。これはストリームの向きに関係します。各ストリームは、標準またはワイドのいずれかにしか設定できません。一度設定すると変更できません。初めて使用されるときに設定されます。 (これはprintfのためにasciiです)。その後、wprintfは誤った向きのため動作しません。

つまり、printf()を使用すると、printf()を引き続き使用する必要があります。同様に、wprintf()で始まる場合は、引き続きwprintf()を使用する必要があります。

printf()wprintf()を混在させることはできません。 (Windowsの場合を除く)

EDIT:

wprintfラインも単独では動作しない理由についての質問に答えます。おそらく、中日友好のUTF-8形式がwchar_に格納されるように、コードがコンパイルされているからでしょう。ただし、wchar_tには4バイトのUnicodeエンコードが必要です。 (Windowsで2バイト)

だから私は考えることができる2つのオプションがあります:

  1. wchar_tと気にしないでください、とだけでマルチバイトchar秒にこだわります。これは簡単な方法ですが、ユーザーのシステムが中国語ロケールに設定されていないと壊れる可能性があります。
  2. wchar_tを使用してください。ただし、Unicodeエスケープシーケンスを使用して中国語文字をエンコードする必要があります。これは明らかにソースコードでは判読不能になりますが、ロケールに関係なく中国語フォントを印刷できるすべてのマシンで動作します。
+0

ユニコードのエスケープseqを使用している場合、私は各中国語のseqを見つける必要がありますか?これはかなり多くの作業が必要になります:P – Alcott

+1

正しい。しかし、これは、あなたがあなたがユニコードのエスケープシーケンスを与えるだけで、中国のテキストをコピーして貼り付けることができますツールをオンラインで見つけることができる十分な共通ですと確信しています。また、コードを読み取り可能にするために、エスケープシーケンスの横にある実際の中国語のテキストをコメントとして保持することができます。 – Mysticial

+0

ありがとうMysticial – Alcott

6

ライン1はASCIIではありません。コンパイル時にコンパイラがマルチバイトエンコーディングを使用しているものは何でも構いません。現代のシステムではおそらくUTF-8でしょう。 printfはエンコーディングを知らない。それはstdoutにバイトを送るだけです。エンコードが一致する限り、すべて正常です。

注意しなければならない問題の1つは、行3と行4が一緒に定義されていない動作を呼び出すことです。 FILEstdout)には、文字ベースの文字とワイド文字の文字を混在させることはできません。最初の操作の後、FILEは "方向"(バイトまたはワイドのいずれか)を持ち、その後、反対方向の操作を実行しようとするとUBになります。

+0

printf()の行には出力がありますが、中国語の文字はありません。どうして? – Alcott

+0

ロケールのエンコーディングが間違っている可能性があります。 –

+0

ロケールのエンコーディング?それを修正するには? – Alcott

1

あなたは1つのステップを省略しているため、間違った方法を考えています。

ディスク上にバイトを含むCファイルがあります。あなたは "ASCII"文字列とワイド文字列を持っています。

ASCII文字列は、1行目と同じようにバイトを取り出して出力します。 これは、ユーザー側のエンコーディングがプログラマー側のエンコーディングと同じであれば機能します。

ワイド文字列は、最初に指定されたバイトをユニコードコードポイントにデコードし、プログラムに格納します。これはあなたの側で間違っているかもしれません。出力時には、ユーザー側のエンコーディングに従ってエンコードされます。これにより、これらの文字は意図したとおりに出力され、入力時には出力されません。

コンパイラが間違ったエンコードを想定しているか、出力端子が正しく設定されていません。

関連する問題