8

非常に古い (10 年) C コードを修正しています。このコードは、Unix/Mac で GCC を使用してコンパイルし、Windows で MinGW を使用してクロスコンパイルします。現在、全体に TCHAR 文字列があります。TCHAR を取り除き、代わりに C++ 文字列を使用したいと思います。Windows 全体の機能を使用する必要はありますか、それとも Unicode と UTF-8 ですべてを行うことができますか?

4

5 に答える 5

9

Windows は今でも UTF16 を使用しており、おそらく常にそうするでしょう。wstringそのためではなく、使用する必要がstringあります。Windows API は、UTF8 が発明される前に Windows が Unicode をサポートしていたため、UTF8 を直接サポートしていません。

そのため、Windows と Unix の両方のプラットフォームでコンパイルできる Unicode コードを書くのはかなり面倒です。

于 2011-06-11T13:56:41.067 に答える
4

Windows 全体の機能を使用する必要はありますか、それとも Unicode と UTF-8 ですべてを行うことができますか?

はい。残念ながら、Windows は UTF-8 をネイティブでサポートしていません。適切な Unicode サポートが必要な場合は、wchar_tバージョンではなく、Windows API 関数のバージョンを使用する必要がありますchar

Windows コードから TCHAR を削除する必要がありますか?

はい、そうすべきです。その理由TCHARは、Windows の Unicode バージョンと非 Unicode バージョンの両方をサポートするためです。非 Unicode のサポートは、Windows 98 がまだ普及していた 2001 年には大きな懸念事項だったかもしれませんが、今日ではそうではありません。

また、非 Windows 固有のライブラリが同じ種類のchar/wchar_tオーバーロードを使用可能にするTCHAR可能性はほとんどありません。

それでは、すべてのTCHARs をwchar_ts に置き換えてください。

このコードは、Unix/Mac で GCC を使用してコンパイルし、Windows で MinGW を使用してクロスコンパイルします。

以前、クロスプラットフォームの C++ コードを書かなければなりませんでした。(現在、私の仕事はクロスプラットフォームの C# コードを書いています。) Windows が UTF-8 をサポートしておらず、Un*x が UTF-16 をサポートしていない場合、文字エンコーディングはかなり面倒です。最終的に、メインのエンコーディングとして UTF-8 を使用し、必要に応じて Windows で変換しました。

于 2011-06-11T16:10:28.243 に答える
0

あなたの質問に直接答えるには:

Windows全体の機能を使用する必要がありますか、それともUnicodeとUTF-8ですべてを実行できますか?

いいえ、(非ASCII)UTF-8は、ほとんどのWindowsAPI関数で受け入れられません。それでも、ワイドAPIを使用する必要があります。

同様に、他のOSがまだをサポートしていないことを嘆くことができwchar_tます。したがって、UTF-8もサポートする必要があります。

他の回答は、クロスプラットフォームのコードベースでこれを管理する方法に関するいくつかの良いアドバイスを提供しますが、さまざまな文字タイプをサポートする実装がすでにあるように聞こえます。コードを単純化するためにそれを取り除いて聞こえるかもしれませんが、そうしないでください。

于 2011-06-11T14:07:07.760 に答える
0

はい、最近ではユニコード以外のアプリケーションを作成することは、自分自身を傷つけています。どこでもワイド API を使用するだけで、後でそれについて泣く必要はありません。プラットフォーム間の (ネットワーク) 通信が必要ない (または Win32 API を使用する wchar_t を UTF-8 に変換する) 必要がない場合は、UNIX では UTF8 を、Windows では wchar_t を引き続き使用できます。 Win32 API 関数を使用するときは wchar_t に (それが私がしていることです)。

于 2011-06-11T13:58:40.587 に答える
0

そして、おそらく 2020 年より前ではないが、いつの日か Windows が UTF-8 のサポートを追加するだろうと私は予測している。これは単に、すべての API 関数の U バージョンを A と W に加えて、同じ種類のリンカー ハックを追加することによって行われる。8 ビットの A 関数は、ネイティブの W (UTF-16) 関数に対する単なる変換レイヤーです。A層からU層を半自動的に生成できるに違いない。

「20世紀」のUnicodeサポートについて、彼らが十分に、十分にからかわれたら...

慎重に選択されたマクロとデフォルトの Visual Studio 設定を使用することで、デフォルトでは、書きにくく、読みにくく、移植性が低くなります。

于 2012-09-13T01:39:33.713 に答える