6

Linux でアプリケーションを開発したいと考えています。アプリケーションが Unicode をサポートする必要があり、UTF-8 文字列を使用したくないため、wstring を使用したいと考えています。

Windows OS では、wstring を使用するのは簡単です。ANSI API には Unicode 形式があるためです。たとえば、2 つの CreateProcess API があり、最初の API は CreateProcessA で、2 番目の API は CreateProcessW です。

wstring app = L"C:\\test.exe";
CreateProcess
(
  app.c_str(), // EASY!
  ....
);

しかし、Linux で wstring を使用するのは複雑なようです。たとえば、Linux にはparport_openという API があります(これは単なる例です)。

wstring をこの API (または、文字列パラメーターを受け入れる parport_open などの API) に送信する方法がわかりません。

wstring name = L"myname";
parport_open
(
  0, // or a valid number. It is not important in this question.
  name.c_str(), // Error: because type of this parameter is char* not wchat_t*
  ....
);

私の質問は、Linux API で wstring(s) を使用するにはどうすればよいですか?

: UTF-8 文字列は使用したくありません。

ありがとう

4

2 に答える 2

5

ほぼすべてのディストリビューションの Linux API (最近のカーネルで正しいロケール設定を使用) は、デフォルトで UTF-8 文字列を使用します1。あなたもコード内でそれらを使用する必要があります。抵抗しても無駄だ。

Windowsのwchar_t(したがってwstring) は、Unicode が 65536 文字に制限されている (つまり、UCS-2 に使用されていた) 場合にのみ便利でしたwchar_t。現在、16 ビット Windowswchar_tが UTF-16 に使用されているため、1 wchar_t=1 Unicode 文字の利点は長いです。そのため、UTF-8 を使用する場合と同じ欠点があります。現在、私見ではLinuxのアプローチが最も正しいです。(UTF-16に関する私の別の回答と、WindowsとJavaがそれを使用する理由

ちなみに、stringwstringはどちらもエンコーディングを認識しないため、これら 2 つのいずれかを使用して Unicode コード ポイントを操作することはできません。wxStringwxWidgets ツールキットは UTF-8 を適切に処理すると聞きましたが、それについて詳しく調査したことはありません。


  1. 実際には、以下で指摘されているように、カーネルはエンコーディングにとらわれないことを目指しています。つまり、文字列を (NUL で終了する?) バイトの不透明なシーケンスとして扱います (そのため、UTF-16 のような「より大きな」文字タイプを使用するエンコーディングは使用できません)。使用済み)。一方、実際の文字列操作が行われる場合は常に現在のロケール設定が使用され、ほとんどすべての最近の Linux ディストリビューションではデフォルトで UTF-8 に設定されます (これは私にとって妥当なデフォルトです)。
于 2011-09-04T14:17:27.400 に答える
0

UTF-8 文字列を使用したくありません。

少なくとも API を呼び出すときは、その抵抗を克服する必要があります。Linux は、常に UTF-8 の 1 バイト文字列エンコーディングを使用します。期待する関数にワイド文字を渡すことは明らかにできないため、明らかにシングルバイト文字列型を使用する必要がありますchar*stringではなく使用しwstringます。

于 2011-09-04T14:20:06.820 に答える