1

C では、次のように Unicode 文字を printf() に渡すことができます。

printf("some unicode char: %c\n", "\u00B1");

しかし、問題は、POSIX 準拠のシステムでは `char' が常に 8 ビットであり、上記のような UTF-8 文字のほとんどは幅が広く、char に収まらず、結果として端末に何も表示されないことです。ただし、この効果を達成するためにこれを行うことができます:

printf("some unicode char: %s\n", "\u00B1");

%s プレースホルダーは自動的に展開され、Unicode 文字が端末に出力されます。また、標準では次のように述べています。

ユニバーサル文字名の 16 進値が 0x20 未満または 0x7F から 0x9F の範囲 (両端を含む) にある場合、またはユニバーサル文字名が基本ソース文字セットの文字を指定している場合、プログラムは整形式ではありません。

私がこれを行うとき:

printf("letter a: %c\n", "\u0061");

gcc 言います:

エラー: \u0061 は有効なユニバーサル文字ではありません

したがって、この手法は ASCII 文字の印刷にも使用できません。ウィキペディアのこの記事http://en.wikipedia.org/wiki/Character_(computing)#cite_ref-3には、次のように書かれています。

C プログラミング言語の char は、正確に 1 バイトのサイズのデータ​​型であり、基本的な実行文字セットと UTF-8 コード単位の任意のメンバーを含めるのに十分な大きさに定義されています。

しかし、これはPOSIXシステムで実行できますか?

4

1 に答える 1

3

バイトベースの文字列でのユニバーサル文字の使用は、コンパイル時と実行時の文字エンコーディングの一致に依存するため、特定の状況を除いて一般的にはお勧めできません。ただし、ワイド文字列およびワイド文字リテラルでは非常にうまく機能します。printf("%ls", L"\u00B1");またはprintf("%lc", L'\00B1');、ロケールの正しいエンコーディングで U+00B1 を出力します。

于 2013-09-01T14:56:44.090 に答える