1

エンコーディング (UTF-8,16,32) に関係なく、文字列を画面に出力したいと思います。この文字列は char 配列で表されるため、null バイトを無視して stdout への出力を続行する必要があります。これにより、printf の家族や友人は問題外になります。

char text[] = { 0x00, 0x55, 0x00, 0x6E, 0x00, 0x69, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x64, 0x00, 0x65 };

fwrite( text, sizeof(char), sizeof(text), stdout );

この目的のために、上記のソリューションを選択して、すべての UTF エンコーディング形式を印刷できるようにしました。特定の端末では文字が正しく表示されないことは理解していますが、アプリケーションの外部で構成可能なオプションであるため、それは私の懸念事項ではありません。

私のアプリケーションには、ロードするメッセージ カタログ (en_EN.UTF-8 など) に関する設定がありますが、現在選択されているロケールに基づいてコードで文字列変換を行う必要がないようにしたいと考えています。

公開する前に、このアプローチのレビューをお願いできますか?

4

2 に答える 2

1

そんなことはできません。テキストを扱うとき、エンコーディングは非常に重要です。したがって、変換を行う必要があります。

また、char 配列に保持するのも良くありません。byte 配列を使用する必要があります。なぜなら:

  • 一部のヘッダーでまだ定義されていない場合は、byte を unsigned char として定義 (または typedef) する必要があります。プレーン char は、署名付きまたは署名なしのどちらでもかまいません。驚きがあります。
  • 意図が明確になるため、より読みやすくなります。バイトですね、バイトの集まりです。char が表示されます。これはプレーン テキストです (そして、あなたの場合、明らかにそうではありません)。
于 2011-12-01T11:16:54.207 に答える
0

ビッグエンディアンモードでchar配列を定義し、ターミナルがリトルエンディアンを受け入れる場合はどうなりますか?またはその逆?私も、物事を扱うとき、回心なしでは生きていけないと思いますchar -> Utf(エンディアンのせいだけです)。また、いくつかを定義させるのは合理的です

typedef unsigned char  utf8char;
typedef unsigned short utf16char;
typedef unsigned int   utf32char;

typedef enum {
   BIG_ENDIAN,
   LITTLE_ENDIAN
} CHAR_ENDIANNESS

そうすることで、UTFへの変換がより透過的になり、デバッグが容易になり、コードのメンテナンスも改善されます。

于 2011-12-01T15:58:44.103 に答える