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);
}
よろしくお願いします。
No.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用に変換します。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- CGI htmlからパラメータで、cgiに渡したい。 1 2023/02/06 16:15
- C言語・C++・C# TCP/IP通信時のサーバーからの受信 2 2022/11/23 09:11
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- C言語・C++・C# leetcode 155 minstack 1 2022/05/07 16:43
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- 化学 Triton X-100 bufferの作り方について 1 2022/07/12 11:27
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- 楽器・演奏 ギターのエフェクターについてです! スプリッターとは何ですか?自分はempress effects 1 2023/03/18 21:12
- 英語 英文解説お願いします 1 2023/01/09 22:37
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「彡」って文字はなんという文...
-
セル内の文字列が日本語か英語...
-
std::stringからLPCWSTR型への変換
-
フォームのコントロールのバッ...
-
EBCDIC⇒SJIS変換の方法
-
COBOLによる全角・半角混...
-
英数字を含む文字列(0-9,A-Z)...
-
Symfowareでのデータ型変換につ...
-
Excelマクロにて30分単位の計算...
-
相対パスを絶対パスに変換したい
-
VBScript ASC関数:文字エンコ...
-
VBAでbmp画像をASCIIデータとし...
-
RubyでUTF8のコード値を文字に...
-
VBでバイナリデータについて。
-
ビット反転(Not)が機能しない
-
VS 2008(VB.NET)
-
Excel vba で1と10を正確に判断...
-
コード変換について
-
数字5桁文字コード?
-
HP-UXでの文字コード変換方法
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
EBCDIC⇒SJIS変換の方法
-
セル内の文字列が日本語か英語...
-
「彡」って文字はなんという文...
-
std::stringからLPCWSTR型への変換
-
ExcelVBA実行後に時々落ちる
-
sedで日本語の置換方法について
-
COBOLによる全角・半角混...
-
ふりがなをアルファベット化す...
-
英数字を含む文字列(0-9,A-Z)...
-
VS 2008(VB.NET)
-
Symfowareでのデータ型変換につ...
-
S-JIS → JIS コード変換するには
-
CString ←→ BSTRの変換について
-
数字5桁文字コード?
-
10進数→2進数への変換
-
2バイト文字をJEFからSJISに変...
-
JIS → S-JIS コード変換するには
-
EBCDICへの変換
-
RubyでUTF8のコード値を文字に...
-
latin-1 (ISO-8859-1)への変換
おすすめ情報