Windows API ANSI関数をUTF-8文字列で使用できますか?Windows API ANSI関数とUTF-8
たとえば、パスがUTF-8でエンコードされているとします。 CreateDirectoryA
またはCreateFileA
に電話し、UTF-8パスを使用することはできますか、または関数を呼び出す前に変換を実行する必要がありますか?
Windows API ANSI関数をUTF-8文字列で使用できますか?Windows API ANSI関数とUTF-8
たとえば、パスがUTF-8でエンコードされているとします。 CreateDirectoryA
またはCreateFileA
に電話し、UTF-8パスを使用することはできますか、または関数を呼び出す前に変換を実行する必要がありますか?
いいえMultiByteToWideChar
を使用して、UTF-8をUTF-16に変換し、CreateDirectoryW
またはCreateFileW
などのワイド文字APIを呼び出します。
くそー、私はそれを恐れていた:(Gah ..それでは、それをもっとうまく始める.. – krebstar
WindowsはUTF-16を排他的に使用しているので、それを追加することもできます。 -16、大部分はUTF-8に変換するだけです。 – casablanca
@casablanca:主張されている別のアプローチは、ほとんどの場合UTF-8を使用して、 UTF-16からWindowsインターフェイスに話しているときにのみ。 –
(Win32 APIのMultiByteToWideCharを使用するよりも)簡単なアプローチは、CA2CWのようにATL conversion helpersを使用することです。あなたは、UTF-8 UnicodeのUTF-16へのUnicodeから変換するには、コードページ(コンストラクタの2番目のパラメータ)としてCP_UTF8を指定することができます。
CreateDirectoryW(
CA2W(utf8Name, CP_UTF8) // convert from UTF-8 to UTF-16
... // other stuff
);
注意をUnicodeで構築していること(デフォルトのものであるべきであるこれらのCreateDirectoryは単にCreateDirectoryWに展開されるので、最後の "W"をドロップして、(IMHO、より読みやすい)CreateDirectoryを使用します:
CreateDirectory(
CA2W(utf8Name, CP_UTF8) // convert from UTF-8 to UTF-16
... // other stuff
);
Yikes。なぜ誰もそれを望むだろうか?私たちは今Windows MEを過ぎていると思います(ANSI APIを必要とした最後のWindows版でした)。彼らはすでに、特に新しく開発されたアプリケーションのために消滅するはずです。 – Joey
UTF-8文字列はどこから入手していますか?いわゆるワイドバージョンのWindows API関数のように、アプリケーションをUTF-16文字列で完全に動作させる方が簡単です。 Joeyの言うとおり、* ANSIバージョンではなく、常にワイドバージョン( 'W'接尾辞付き)を呼び出します。それらは何十年も時代遅れです。 –
@Joey:非常に多くのC(++)ライブラリ(標準ライブラリを含む)は 'wchar_t'ベースの文字列ではなく' char'ベースの文字列を扱う方が好きです。 WindowsがUTF-8を完全にサポートしていれば、UTF-8とUTF-16の間で常に変換するのではなく、プログラム全体でUTF-8を使用できます。 – dan04