web-dev-qa-db-ja.com

CでUnicode記号を印刷する

Cを使用してLinuxターミナルでUnicodeスター文字( x2605 )を印刷しようとしています。サイトの他の回答で提案されている構文に従いましたが、出力が得られません。

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

int main(){

    wchar_t star = 0x2605;
    wprintf(L"%c\n", star);

    return 0;
}

特にncursesライブラリでこれを機能させる方法についての提案をいただければ幸いです。

6
Luke Collins

2つの問題:まず、wchar_t%lcではなく%c形式で印刷する必要があります。 2つ目は、setlocaleを呼び出さない限り、文字セットが正しく設定されておらず、星の代わりに?が表示される可能性があることです。ただし、次のコードは機能しているようです。

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

int main() {
    setlocale(LC_CTYPE, "");
    wchar_t star = 0x2605;
    wprintf(L"%lc\n", star);
}
7
Antti Haapala

Stdioまたはncursesのどちらを使用している場合でも、 ncursesマニュアル に記載されているように、ロケールを初期化する必要があります。そうしないと、UTF-8などのマルチバイトエンコーディングが機能しません。

wprintwは必ずしもwchar_tについて知っているわけではありません(同じ基礎となるprintfを使用する場合がありますが、これはプラットフォームと構成によって異なります)。

Ncursesを使用すると、次のいずれかの方法でwchar_tを表示します。

  • それをwchar_tの配列に格納し、 waddwstr を使用する、または
  • それをcchar_t構造体(setccharを使用)に格納し、それをパラメーターとして wadd_wch を使用する、または
  • wchar_tをマルチバイト文字列に変換し、 waddstr を使用する
3
Thomas Dickey