「Win32/64技術 003 ワイド文字列→マルチバイト文字列変換」の版間の差分
編集の要約なし |
(→概要) |
||
38行目: | 38行目: | ||
*WC_DEFAULTCHAR:変換中に、変換できない文字をデフォルトの文字に置き換えるためのフラグです。変換できない文字は、指定したコードページに存在しない場合などに発生することがあります。 | *WC_DEFAULTCHAR:変換中に、変換できない文字をデフォルトの文字に置き換えるためのフラグです。変換できない文字は、指定したコードページに存在しない場合などに発生することがあります。 | ||
*WC_DISCARDNS:ノンスパース文字(Non-Spacing Character)を無視するためのフラグです。ノンスパース文字は、文字コード内で文字を修飾するために使用される文字で、変換中にこれらを無視することができます。 | *WC_DISCARDNS:ノンスパース文字(Non-Spacing Character)を無視するためのフラグです。ノンスパース文字は、文字コード内で文字を修飾するために使用される文字で、変換中にこれらを無視することができます。 | ||
*WC_SEPCHARS:パススルー文字を処理するためのフラグです。パススルー文字は、変換されずにそのまま出力される特定の文字です。このフラグを指定すると、パススルー文字が正しく処理されます。 | *WC_SEPCHARS:パススルー文字を処理するためのフラグです。パススルー文字は、変換されずにそのまま出力される特定の文字です。このフラグを指定すると、パススルー文字が正しく処理されます。 |
2023年11月1日 (水) 00:23時点における版
概要
ワイド文字のUTF-16から変換してマルチバイトのSJIS(Shift_JIS、Microsoft提唱のコードページcp932とも呼ばれる)やUTF-8に変換する方法です。MultiByteToWideChar関数にあい対する関数WideCharToMultiByteを使います。
wchar_t pwchstr[] = L"Win32/64アプリケーション";
int icharLen = WideCharToMultiByte(932, 0, pwchstr, -1, nullptr, 0, nullptr, nullptr);
char* chstr = new char[icharLen];
WideCharToMultiByte(932, 0, pwchstr, -1, chstr, icharLen, nullptr, nullptr);
標準string型 wstring型を使う場合(推奨)
wchar_t pwchstr[] = L"Win32/64アプリケーション";
std::wstring wstringUTF16str = std::wstring(pwchstr);
int icharLen = WideCharToMultiByte(932, 0, wstringUTF16str.c_str(), -1, nullptr, 0, nullptr, nullptr);
std::string stringSJISstr(icharLen, 0);
WideCharToMultiByte(932, 0, wstringUTF16str.c_str(), -1, stringSJISstr.c_str(), stringSJISstr.size(), nullptr, nullptr);
■WideCharToMultiByte(UINT, DWORD, LPCWCH, int, LPSTR, int, LPCCH, LPBOOL)
第1引数:UINT CodePage
文字コードの変換もできます。この関数では変換先の文字コードを指定します。逆変換では、変換元の文字コードを指定していました。
第2引数:DWORD dwFlags
- WC_COMPOSITECHECK:合成文字を検査するためのフラグです。正準分解形の0x0065(e) 0x0301(´)を検出し、きちんと合成文字のéを得ます。指定しない場合は、0x0065(e)と0x0301(´)を別々の文字として処理します。処理速度を犠牲にするので、そのような文字が含まれない場合は指定する必要はないでしょう。
- WC_DEFAULTCHAR:変換中に、変換できない文字をデフォルトの文字に置き換えるためのフラグです。変換できない文字は、指定したコードページに存在しない場合などに発生することがあります。
- WC_DISCARDNS:ノンスパース文字(Non-Spacing Character)を無視するためのフラグです。ノンスパース文字は、文字コード内で文字を修飾するために使用される文字で、変換中にこれらを無視することができます。
- WC_SEPCHARS:パススルー文字を処理するためのフラグです。パススルー文字は、変換されずにそのまま出力される特定の文字です。このフラグを指定すると、パススルー文字が正しく処理されます。
- WC_NO_BEST_FIT_CHARS:このフラグを指定すると、ベストフィット文字が使用されず、文字が失われる可能性があります。
- WC_ERR_INVALID_CHARS フラグを指定すると、変換中に無効な文字が検出された場合にエラーを発生させることができます。UTF-16はUnicodeという広範囲な文字セットですので、より小さな文字セットに変換する場合は存在しない文字コードもあります。その場合処理を止める必要があるなら、このフラグが必要です。
第3引数:LPCWCH lpWideCharStr
第4引数:int cchWideChar
第5引数:LPSTR lpMultiByteStr
第6引数:int cbMultiByte
第7引数:LPCCH lpDefaultChar
第8引数:LPBOOL lpUsedDefaultChar