2

この質問はよく聞かれると思いますが、これを行うより良い方法がないことを確認したいだけです.

基本的に、null で終わる C 文字列を指す const char* があります。同じ文字を含む文字列を指す const wchar_t* を期待する別の関数があります。

とりあえず、以下のようにしてみました。

    size_t newsize = strlen(myCString) + 1;
    wchar_t * wcstring = new wchar_t[newsize];
    size_t convertedChars = 0;

    mbstowcs_s(&convertedChars, wcstring, newsize, myCString, _TRUNCATE);

    delete[] wcstring;

どちらか一方を期待するサードパーティのライブラリを扱っているため、多くの場所でこれらの変換を行う必要があります。これはこれについての推奨される方法ですか?

4

2 に答える 2

2

データがすべてASCIIであると仮定すると、実行していることは、それを実行するためのほぼ推奨される方法です。そこに非ASCIIデータがある場合は、そのエンコーディングが何であるかを知る必要があります:UTF-8、Windows-1252、ISO 8859バリアントのいずれか、SHIFT-JISなど。それぞれを異なる方法で変換する必要があります。 。

私が変更する唯一のことは、mbstowcsの代わりに使用することですmbstowcs_smbstowcs_sはWindowsでのみ使用できますmbstowcsが、は移植可能な標準のC99関数です。もちろん、MicrosoftコンパイラでCRTの非推奨警告を完全にオフにせずに回避したい場合は、#ifテストのマクロを使用mbstowcsしてWindows以外のシステムおよびWindowsシステムで使用することはまったく問題ありませんmbstowcs_s

mbstowcsを使用して、最初に宛先に渡すことにより、変換された文字列の長さを取得することもできNULLます。そうすれば、入力文字列の長さに関係なく、切り捨てを回避できます。ただし、文字列を2回変換する必要があります。

非ASCII変換の場合は、libiconvを使用することをお勧めします。

于 2012-10-18T19:18:07.043 に答える
0

どのエンコーディングが関係しているかは述べていません。非マルチバイト文字列がある場合は、これを使用できます。

std::string a("hello");
std::wstring b(s.begin(), s.end());

const wchar_t *wcString= b.c_str();
于 2012-10-18T19:57:24.247 に答える