0

ここに私のCコードがあります:

int main(){
  _setmode(_fileno(stdout), _O_U16TEXT);
  FILE* myFile = fopen("text.txt", "r");
  wchar_t line[100];
  fgetws(line,100,myFile);
  clear();
  initscr();
  addwstr(L"♠♣♥♦\n");
  addwstr(line);
  refresh();
  getchar();
  endwin();
  return 0;
}

text.txt ファイルは次のとおりです。

♠♣♥♦

最初のものは問題なく表示されますが、2 つ目は一連の奇妙な文字です。理由を知っている人はいますか?

4

1 に答える 1

0

gcc は 2 番目のケースの引数を(接頭辞wchar_tを使用して) の配列として表し、一方で(プラットフォームに応じて UCS-2 または UCS-4 のいずれか。Windows を使用している場合は通常前者)の配列を返します。L"fgetwswchar_t

ただし、ファイルから読み取られるデータは、次の理由で異なる場合があります。

  • バイトオーダーが異なります。
  • 関数がバイト順マークを予期してfgetwsいる (または予期していない)
  • 実際のデータは期待と一致しませんでした。

この違いは、データ ファイルのダンプ (hexdump または od) と、テスト プログラムで読み取られた/使用された実際のデータを数値の配列として出力することで確認できます。これらのワイド文字は外部表現にマルチバイトエンコーディングを使用するため、バイト オーダーに不一致があると、ガベージが表示されます。

たとえば、外部ファイルは UTF-8 としてエンコードされている可能性がありますが (これは MinGW のように聞こえます)、 はfgetwsUTF-16 (またはその逆) のみを想定します。しかし、数値がどのように見えるかを正確に確認することから始めれば、問題が明らかになります。

于 2018-06-09T11:18:50.937 に答える