2

1 wprintf が 'Ω' を 3A9 (UTF16) として表示するのは本当に奇妙ですが、wctomb は wchar を CEA9 (UTF8) に変換します。私のロケールはデフォルトの en_US.utf8 です。man ページが言ったように、それらは私のロケールに準拠する必要がありますが、wpritnf は UTF16 を使用します。なぜですか?

http://www.fileformat.info/info/unicode/char/3a9/index.htmからの抜粋

Ω (UTF)

UTF-8 (16 進数) 0xCE 0xA9 (cea9)

UTF-16 (16 進数) 0x03A9 (03a9)

2 wprintf と printf を同じプログラムで実行することはできません。wprintf または printf のいずれかを使用する必要があります。なぜですか?


私のプログラムを見てください:

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

int main() {
  setlocale(LC_ALL,""); // inherit locale setting from environment
  int r;
  char wc_char[4] = {0,0,0,0};
  wchar_t myChar1 = L'Ω'; //greek 

  // should comment out either wprintf or printf, they don't run together
  r = wprintf(L"char is %lc (%x)\n", myChar1, myChar1);//On Linux, to UTF16

  r = wctomb(wc_char, myChar1); // On Linux, to UTF8
  r = printf("r:%d, %x, %x, %x, %x\n", r, wc_char[0], wc_char[1], wc_char[2], wc_char[3]);
}
4

3 に答える 3

6

2 番目の質問に対する答えは、ストリームの向きに関するものです。とを混在させることはできません。それらは異なる向きを必要とするためですprintf()wprintf()

プロセスの開始時には、ストリームはまだ設定されていません。ストリームを使用する関数の最初の呼び出しで、それに応じて設定されます。printf()向きをノーマルにwprintf()設定し、ワイドに設定します。

現在の設定とは異なる方向を必要とする関数を呼び出すことは、未定義の動作です。

于 2011-10-09T00:44:08.363 に答える
2

wprintf線が何を印刷しているかをどの程度正確に判断していますか?質問の下のコメントは、の結果を調べていることを意味しているようです。これは、文字エンコードに関係なく(ただし、文字セットに関係なく、違いがあります)wprintf ("%x", myChar1);の内部数値を出力します。myChar1コンパイラが内部でUnicodeforsを使用していると仮定するとwchar_t(かなり安全な方法だと思います)、UTF-16とUTF-8の違いに関係なく、0x3a9である「Ω」のUnicodeコードポイントを出力するだけです。wprintfUTF-16を出力しているかどうかを判断するには、出力された生のバイトを直接調べる必要があります(たとえば、with hexdump(1))。たとえば、私のコンピューターでは、このwprintf行は次のように出力します。

63 68 61 72 20 69 73 20 ce a9 20 28 33 61 39 29 0a
c  h  a  r     i  s     Ω        (  3  a  9  )  \n

オメガはUTF-8でバイトCEA9としてエンコードされていますが、の数値wchar_tは3A9のままであることに注意してください。

于 2011-10-09T02:46:43.827 に答える
0

あ、見つけたかも。実行する必要があります

setlocale(LC_ALL, "")

最初。wchar I/O 関数が LC_ 環境変数を尊重していないようです。

背景の詳細​​については、 http://littletux.homelinux.org/knowhow.php?article=charsets/ar01s08を参照してください。

于 2012-05-25T19:38:35.660 に答える