potuです。お世話になってます。
「 http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?rint+200208/02080088.txt」
と同じようなことなのですが、質問は文字の変換についてです。
今回は、char → UTF8 への変換を行いたいと思っています。
手順としては、
①呼び元で変換する文字が「Work」に格納され、渡されてきます。
②それを変換します。、
③変換した文字を「Buf」に格納し、呼びもとに返します。
②で「UTF8」に変換することが出来ずに困っています。
WideCharToMultiByteを使用して書いたプログラムを下記に載せます。
「ここが違う」などのご指摘をしていただけると幸いです。
------ここから
void xxx( char* Work, char* Buf )
// Work 変換する文字(入力済み。例えば「potu」など
// Buf 変換した結果の文字を格納。
{
wchar_t wszBuf[1600];
// Char → Unicode
WideCharToMultiByte(
CP_UTF8,
0,
(const unsigned short *)pcWork,
-1,
(char *)wszBuf,
2048 * 2,
NULL,
NULL);
// Unicode → UTF8
MultiByteToWideChar(
CP_UTF8, // ANSI code page
0, // 既定の変換方法
(const char *)wszBuf, // 変換元文字列
-1, // 変換元文字列サイズ(-1指定で自動計算)
(unsigned short *)pcBuf, // 変換先バッファ
1025); // 変換先バッファサイズ
return;
}
------ここまで
環境は、Win2000, VC6.0, コンソールアプリで作成しています。
ご教授をお願いいたします。
丸囲み数字はJIS X 0208外の文字です。使わないようにしましょう。
あと,
・コードを写すときには元のコードと間違いが無いことを確認すること
#pcWork, pcBufは定義されていません。
・エラーがあるならエラーコード(GetLastErrorの戻り値含む),出力結果などを提示すること
を行って下さい。
とりあえず,手順が完全に間違っています。
> // Char → Unicode
> WideCharToMultiByte(
従来コード(UTF-8含む)からワイド文字に変換するには,MultiByteToWideCharを使います。
std::vector<wchar_t> wide_buffer(MultiByteToWideChar(CP_ACP, 0, Work, -1, 0, 0));
if (wide_buffer.size() == 0) return; // Error!
if (MultiByteToWideChar(CP_ACP, 0, Work, -1, &wide_buffer[0],
wide_buffer.size()) != wide_buffer.size()) return; // Error!
> // Unicode → UTF8
> MultiByteToWideChar(
ワイド文字から従来コードに変換するにはWideCharToMultiByteを使います。
YuOさんレスありがとうございます。
おかげ様で、作りたいプログラムができました!
YuOさんに教えていただいた通り、
>従来コード(UTF-8含む)からワイド文字に変換するには,MultiByteToWideCharを使います。
>ワイド文字から従来コードに変換するにはWideCharToMultiByteを使います。
として、YuOさんのプログラムを参考に作りました。
あと、
>丸囲み数字はJIS X 0208外の文字です。使わないようにしましょう。
>あと,
>・コードを写すときには元のコードと間違いが無いことを確認すること
>#pcWork, pcBufは定義されていません。
>・エラーがあるならエラーコード(GetLastErrorの戻り値含む),出力結果などを提示すること
>を行って下さい。
これは私のミスです。すみません。
今度から気をつけます。
下記に、プログラムを載せます。
ありがとうございました。
----------------------------------------------------------
void xxx( char* pcWork, char* pcBuf )
// Work 変換する文字(入力済み。例えば「potu」など
// Buf 変換した結果の文字を格納。
{
wchar_t wszBuf[1600];
// Char → Unicode
MultiByteToWideChar(
CP_ACP, // ANSI code page
0, // 既定の変換方法
(const char *)pcWork, // 変換元文字列
-1, // 変換元文字列サイズ(-1指定で自動計算)
(unsigned short *)wszBuf, // 変換先バッファ
1025); // 変換先バッファサイズ
// Unicode → UTF8
WideCharToMultiByte(
CP_UTF8,
0,
(const unsigned short *)wszBuf,
-1,
(char *)pcBuf,
2048 * 2,
NULL,
NULL);
return;
}
----------------------------------------------------------