2009-06-18 5 views
29

情報を失うことなく、C++ std::stringをUTF-8またはstd::wstringに変換しようとしています(非ASCII文字を含む文字列とみなされます)。 http://forums.sun.com/thread.jspa?threadID=486770&forumID=31によるとstd :: string.c_str()はどのエンコードを使用しますか?

のstd ::文字列が非ASCII文字が含まれている場合は、UTF-8にエンコーディングから変換する関数を提供しなければならない[...]

std::string.c_str()はどのようなエンコーディングを使用しますか?クロスプラットフォームの方法でUTF-8またはstd::wstringに変換するにはどうすればよいですか?

答えて

35

std::stringは、エンコーディングを使用しません。エンコーディングは使用しないでください。たとえば、これらのバイトはISO-8859-1エンコーディングを使用している可能性があります。実際には、エンコーディングに関する情報は存在しません。バイトがどこから来たのかを知る必要があります。

+0

本質的に私はstd :: stringをエンコードする前にそのエンコードを知らずに変換する方法はありませんか?私はstd :: stringを取るAPI関数を書いているので尋ねます。私はドキュメンテーションがどのフォーマットを渡すべきかをユーザーに指示する必要があると思います。 – Gili

+3

@ギリ、右:未知のエンコーディングのバイトシーケンスをUTF-8(または他のもの;-)に確実に変換することはできません。呼び出し元にUTF-8データを提供するように依頼することをお勧めします。他のほとんどのエンコーディングでは、可能なすべてのUnicode文字列をエンコードできません。 @Naaffによると、ASCIIはUTF-8(とISO-8859- *や他の多くのエンコーディング)の特別なケースですので、そういう場合は心配はありません(この事実をユーザに思い出させる脚注は_them_心配;-)。 –

+0

良い答え、ありがとう:) – Gili

7

std::stringには任意のバイトシーケンスが含まれているため、エンコードはあなた次第です。それがどのようにコード化されているか知っていなけれしかし、それが何か他のものであるかどうかわからないのであれば、それはたぶんASCIIです。この場合、すでにUTF-8と互換性があります。

+12

「おそらく... "は非常に多くの文字エンコーディングエラーの原因になります。 文字エンコードに関しては決して推測しないことをお勧めします。どちらの場合でも、文字セットを指定しない場合は、エンコーディングを示す追加のパラメータ/戻り値を指定します。 – MtnViewMark

関連する問題