プロが教えるわが家の防犯対策術!

VC++2005 Windous7 で作業しています。

シフトジス + ソケット
で作ったメールソフトを、ユニコード版にしようとしているのですが、
Winsock の扱いは、下の例のように、コード変換をしながら扱ってゆくしかないのでしょうか?
wchar_t を直接受け取ってくれる関数は無いのでしょうか?


void MyClass::socksend(const wchar_t* wbuffer) {
// determine the required buffer size
size_t buffer_size;
wcstombs_s(&buffer_size, NULL, 0, wbuffer, _TRUNCATE);

// do the actual conversion
char *buffer = (char*) malloc(buffer_size);
wcstombs_s(&buffer_size, buffer, buffer_size, wbuffer, _TRUNCATE);

// send the data
size_t buffer_sent = 0;
while (buffer_sent < buffer_size) {
int sent_size = send(this->m_socket, buffer+buffer_sent, buffer_size-buffer_sent, 0);
buffer_sent += sent_size;
}

// cleanup
free(buffer);
}

よろしくお願いします。

A 回答 (1件)

sendの第2引数bufがconst char *なのはインターフェースの設計ミスのようなもので,実質はconst void *です。


なので,TCP/IPを喋る場合に,char *以外の型はsendの第2引数は単純にキャストして渡すことになります。

次に,ワイド文字列の取り扱いですが,SMTPプロトコルでは,コマンドはASCIIを使います。
なので,コマンド自体をワイド文字列で保持している場合,ASCIIへの変換が必要になります。
本文に関しては,
・MIMEはASCIIなので,ワイド文字列で保持しているのであれば変換が必要になります
・ContentはContent-TypeやContent-Transfer-Encodingに依存します。
Content-Type: text/plain; charset=UTF-16LE
Content-Transfer-Encoding: 8bit
とかすれば,一応そのまま書き込むことが出来ます。


以上のように,ワイド文字列の取り扱いは,WinSockの問題ではなく,SMTPの問題になります。
なので,一律に変換してくれるようなAPIはWinSockにはありません。
# ちなみに,NT系列のOSではほとんどのAPIではA系APIは内部でデータをW系API用に変換します。
    • good
    • 0
この回答へのお礼

たいへん参考になりました。

ありがとうございます。

お礼日時:2013/03/15 07:20

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!