Linux /関連プラットフォームのコードでWCHAR_Tが広く使用されていないのはなぜですか?
質問
これは私を興味を持っているので、私は尋ねます - 理由は何なのか wchar_t
Linux/Linuxのようなシステムでは、Windowsにあまり使用されていませんか?具体的には、Windows APIが使用します wchar_t
内部的には、Linuxはそうではないと考えており、これは多くのオープンソースパッケージに反映されています char
タイプ。
私の理解は、キャラクターを与えられたことです c
それを表すには複数のバイトが必要です。 char[]
形 c
のいくつかの部分に分割されています char*
一方、単一のユニットを形成します wchar_t[]
. 。使用するのは簡単ではありませんか wchar_t
いつも?この違いを無効にする技術的な理由を逃しましたか?それとも、それは単なる養子縁組の問題ですか?
解決
wchar_t
プラットフォーム定義の幅を持つ広いキャラクターであり、実際にはあまり役に立ちません。
UTF-8文字は、文字ごとに1〜4バイトに及びます。文字ごとに正確に2バイトに及ぶUCS-2は、現在廃止されており、完全なUnicode文字セットを表すことはできません。
UnicodeをサポートするLinuxアプリケーションは、バイトごとのストレージレイヤーよりも適切に行う傾向があります。 Windowsアプリケーションは、2バイトのみが実行するというこの愚かな仮定を立てる傾向があります。
wchar_t
'のウィキペディアの記事 これに簡単に触れます。
他のヒント
UNIXベースのプラットフォームでUTF-8を使用した最初の人 説明した:
Unicode標準[バージョン1.1で]は、適切な文字セットを定義しますが、不合理な表現[UCS-2]を定義します。すべての文字は16ビット幅(もはや真実ではない)であり、16ビットユニットに通信および保存されていると述べています。また、一対の文字(16進数fffeとfeff)を留保して、送信されたテキストのバイト順序を検出し、バイトストリームの状態を必要とします。 (Unicodeコンソーシアムは、パイプではなくファイルを考えていました。)このエンコードを採用するには、ASCIIとUnicodeの間でプラン9に出入りするすべてのテキストを変換する必要がありましたが、できません。単一のプログラム内で、すべての入力と出力を指揮して、文字を16ビットの量として定義することができます。 さまざまなメーカーによる多様なマシン上の何百ものアプリケーションを備えたネットワーク化されたシステムのコンテキストで 斜体]、それは不可能です。
イタリック体の部分は、モノリシックアプリケーション(Microsoft Office)、非ダイバーマシン(すべてがx86、したがって小さなエンディアン)、および単一のOSベンダーよりも優先されるWindowsシステムとはあまり関連していません。
そして、小さな単一目的のプログラムを持っているというUNIX哲学は、それらのうち、深刻なキャラクター操作を行う必要があることを意味します。
当社のツールとアプリケーションのソースはすでにラテン-1で動作するように変換されていたため、「8ビットセーフ」でしたが、Unicode標準とUTF [-8]への変換はより関与しています。一部のプログラムはまったく変更を必要としませんでした:
cat
, 、たとえば、UTF [-8]で配信された引数文字列を解釈して、それが渡されないファイル名として、open
システム呼び出し、その後、入力から出力へのバイトをコピーするだけです。バイトの値に基づいて決定を下すことはありません...しかし、ほとんどのプログラムには控えめな変更が必要でした。...実際に内部的にルーン[Unicodeコードポイント]で操作する必要があるツールはほとんどありません。より典型的には、ファイル名と同様の些細なタスクの最終的なスラッシュを探す必要があります。 170 Cソースプログラムのうち... 23のみが単語を含んでいます
Rune
.内部的にルーンを保存するプログラムは、主にレゾンドレトがキャラクター操作であるプログラムです:SAM(The Text Editor)、
sed
,sort
,tr
,troff
,8½
(ウィンドウシステムとターミナルエミュレータ)など。ルーンを使用して計算するか、UTFエンコードされたバイト文字列を使用して計算するかを決定するには、関連するテキストをオンデマンドで変換するコストに対して読み取りおよび書き込まれたときにデータを変換するコストのバランスをとる必要があります。比較的一定のデータセットで長い間実行される編集者などのプログラムの場合、Runesがより良い選択です...
Code Pointsが直接アクセス可能なUTF-32は、カテゴリやケースマッピングなどの文字プロパティが必要な場合、実際にはより便利です。
しかし、WideCharsは、UTF-8がWindowsで使用するのが厄介であると同じ理由でLinuxで使用するのが厄介です。 GNU Libcにはありません _wfopen
また _wstat
働き。
ASCIIと互換性があるUTF-8は、Unicodeを多少無視することを可能にします。
多くの場合、プログラムは、文字列を終了できる 0がない限り、入力が何であるかを気にしません(実際には気にする必要はありません)。見る:
char buf[whatever];
printf("Your favorite pizza topping is which?\n");
fgets(buf, sizeof(buf), stdin); /* Jalapeños */
printf("%s it shall be.\n", buf);
Unicodeサポートが必要だとわかったとき、単一のユニット(WCHAR_T)としてマルチバイト文字を持たなければならなかったときだけです。たとえば、バイトではなく、文字列内の文字の数をカウントしなければならない場合。 UTF-8からWCHAR_TへのICONVはすぐにそれを行います。幅のゼロスペースやディクリティックスの組み合わせなどのより大きな問題については、ICUのようなより重いものが必要ですが、とにかくどのくらいの頻度でそれをしますか?
wchar_t
すべてのプラットフォームで同じサイズではありません。 Windowsでは、2つのバイトを使用するUTF-16コードユニットです。他のプラットフォームでは、通常4バイト(UCS-4/UTF-32の場合)を使用します。したがって、これらのプラットフォームが使用時に標準化される可能性は低い wchar_t
, 、それは多くのスペースを無駄にするからです。