WindowsコードからTCharを排除する必要がありますか?
質問
私は非常に古い(10年)Cコードを修正しています。コードは、GCCを備えたUNIX/MACとMINGWを使用したWindows用のクロスコンパイルをコンパイルします。現在、全体にtchar文字列があります。 TCHARを取り除き、代わりにC ++文字列を使用したいと思います。 Windows Wide機能を使用する必要がありますか、それともUnicodeとUTF-8ですべてを実行できますか?
解決
WindowsはまだUTF16を使用しており、おそらく常にそうなる可能性があります。使用する必要があります wstring
それよりも string
したがって。 Windows APIは、UTF8が発明される前にWindowsがUnicodeをサポートしているため、UTF8のサポートを直接提供しません。
したがって、WindowsプラットフォームとUNIXプラットフォームの両方にコンパイルされるUnicodeコードを作成するのはかなり苦痛です。
他のヒント
Windows Wide機能を使用する必要がありますか、それともUnicodeとUTF-8ですべてを実行できますか?
はい。残念ながら、WindowsにはUTF-8のネイティブサポートはありません。適切なUnicodeサポートが必要な場合は、 wchar_t
Windows API機能のバージョンではなく char
バージョン。
WindowsコードからTCharを排除する必要がありますか?
はい、そうすべきです。理由 TCHAR
存在するのは、WindowsのUnicodeバージョンと非ユニコードバージョンの両方をサポートすることです。非ユニコードのサポートは、Windows 98がまだ人気があった2001年には大きな懸念事項であったかもしれませんが、今日ではありませんでした。
そして、ウィンドウ以外のライブラリが同じ種類のものを持っていることはほとんどありません char
/wchar_t
過負荷になります TCHAR
使用可能。
だから先に進んで、すべてを交換してください TCHAR
sと wchar_t
s。
コードは、GCCを備えたUNIX/MACとMINGWを使用したWindows用のクロスコンパイルをコンパイルします。
以前にクロスプラットフォームのC ++コードを作成する必要がありました。 (今、私の仕事はクロスプラットフォームのC#コードを書くことです。)WindowsがUTF-8をサポートせず、UN*XがUTF-16をサポートしていない場合、文字エンコードはかなり痛いです。最終的には、Windowsで必要に応じてメインのエンコードと変換としてUTF-8を使用しました。
はい、最近の非ユニコードアプリケーションを書くことは、自分自身を足で撃っています。どこでもワイドAPIを使用するだけで、後で泣く必要はありません。プラットフォーム間で(ネットワーク)通信を必要としない場合(またはWin32 APIでWCHAR_TをUTF-8に変換する)、UNIXでUNIXおよびWCHAR_TでUTF8を使用できます。 Win32 API関数を使用する場合(それが私がしていることです)。
あなたの質問に直接答えるために:
Windows Wide機能を使用する必要がありますか、それともUnicodeとUTF-8ですべてを実行できますか?
いいえ、(非ASCII)UTF-8は、Windows API関数の大部分によって受け入れられません。まだ広いAPIを使用する必要があります。
同様に、他のOSがまだサポートしていないことを嘆くことができます wchar_t
. 。したがって、UTF-8もサポートする必要があります。
他の回答は、クロスプラットフォームのコードベースでこれを管理する方法に関するいくつかの良いアドバイスを提供しますが、既にさまざまな文字タイプをサポートする実装があるかのように聞こえます。コードを単純化するためにそれをリッピングすることが望ましいのと同じくらい、聞こえるかもしれませんが、しないでください。
そして、いつか、おそらく2020年以前はそうではありませんが、WindowsはAとWと一緒にすべてのAPI関数のUバージョンを追加するだけで、同じ種類のリンカーハックと一緒にUTF-8サポートを追加すると予測しています。 8ビットA関数は、ネイティブW(UTF-16)関数の単なる翻訳層です。私は彼らがA層から半自動的にU層を生成できるに違いない。
彼らが十分に、十分に長い間、彼らの「20世紀」のユニコードのサポートについてからかわれたら...
慎重に選択したマクロとデフォルトのビジュアルスタジオ設定を使用することにより、デフォルトで読むのがugい、ugいないことを厄介にすることができます。