2012-01-12 6 views
18

Windows API ANSI関数をUTF-8文字列で使用できますか?Windows API ANSI関数とUTF-8

たとえば、パスがUTF-8でエンコードされているとします。 CreateDirectoryAまたはCreateFileAに電話し、UTF-8パスを使用することはできますか、または関数を呼び出す前に変換を実行する必要がありますか?

+2

Yikes。なぜ誰もそれを望むだろうか?私たちは今Windows MEを過ぎていると思います(ANSI APIを必要とした最後のWindows版でした)。彼らはすでに、特に新しく開発されたアプリケーションのために消滅するはずです。 – Joey

+1

UTF-8文字列はどこから入手していますか?いわゆるワイドバージョンのWindows API関数のように、アプリケーションをUTF-16文字列で完全に動作させる方が簡単です。 Joeyの言うとおり、* ANSIバージョンではなく、常にワイドバージョン( 'W'接尾辞付き)を呼び出します。それらは何十年も時代遅れです。 –

+4

@Joey:非常に多くのC(++)ライブラリ(標準ライブラリを含む)は 'wchar_t'ベースの文字列ではなく' char'ベースの文字列を扱う方が好きです。 WindowsがUTF-8を完全にサポートしていれば、UTF-8とUTF-16の間で常に変換するのではなく、プログラム全体でUTF-8を使用できます。 – dan04

答えて

15

いいえMultiByteToWideCharを使用して、UTF-8をUTF-16に変換し、CreateDirectoryWまたはCreateFileWなどのワイド文字APIを呼び出します。

+0

くそー、私はそれを恐れていた:(Gah ..それでは、それをもっとうまく始める.. – krebstar

+12

WindowsはUTF-16を排他的に使用しているので、それを追加することもできます。 -16、大部分はUTF-8に変換するだけです。 – casablanca

+4

@casablanca:主張されている別のアプローチは、ほとんどの場合UTF-8を使用して、 UTF-16からWindowsインターフェイスに話しているときにのみ。 –

3

(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 
);