我的思路是这样的:在配置文件(基本上使用XML格式)中采用UTF-8编码,这样世界上的任何文字就都可以显示了。但是如果直接将配置内容读出并显示,在你的C++程序里面肯定是乱码,那么怎么解决呢?步骤如下(直接看代码吧) | |||||||||||||||||
char szUTF8 [] = {0xE4,0XBB,0XB7,0XE5,0X80,0XBC};//是汉语的价值两个字 | |||||||||||||||||
int nLen = MultiByteToWideChar( CP_UTF8, 0, szUTF8, -1, NULL, NULL );//得到UTF8编码的字符串长度,是2 | |||||||||||||||||
LPWSTR lpwsz = new WCHAR[nLen]; | |||||||||||||||||
MultiByteToWideChar( CP_UTF8, 0, szUTF8, -1, lpwsz, nLen );//转换的结果是UCS2格式的价值两个字 | |||||||||||||||||
int nLen1 = WideCharToMultiByte( CP_ACP, 0, lpwsz, nLen, NULL, NULL, NULL, NULL ); | |||||||||||||||||
LPSTR lpsz = new CHAR[nLen1]; | |||||||||||||||||
WideCharToMultiByte( CP_ACP, 0, lpwsz, nLen, lpsz, nLen1, NULL, NULL );//转换完毕,得到了在我的机器上的"价值"两个字的二进制编码0xbc 0xdb 0xd6 0xb5 | |||||||||||||||||
delete [] lpwsz; delete [] lpsz; | |||||||||||||||||
以下为原创 | |||||||||||||||||
下面是我程序中用到之处: | |||||||||||||||||
C++服务器端与C#客户端进行SOCKET通信,需要编码转换。 | |||||||||||||||||
C++服务器端(对接受到的UTF-8码转换成acsii): | |||||||||||||||||
#include <windows.h> | |||||||||||||||||
#pragma comment(lib, "winmm.lib") | |||||||||||||||||
#pragma comment(lib, "wsock32.lib") | |||||||||||||||||
将用于SOCKET通信的以上三行代码放到StdAfx.h中。 | |||||||||||||||||
#include "stdafx.h" | |||||||||||||||||
#include "Winsock2.h" | |||||||||||||||||
#include "stdio.h" | |||||||||||||||||
void CSocketTestDlg::OnButton1() | |||||||||||||||||
{ | |||||||||||||||||
WORD wVersionRequested; | |||||||||||||||||
WSADATA wsaData; | |||||||||||||||||
int err; | |||||||||||||||||
wVersionRequested = MAKEWORD( 1, 1 ); | |||||||||||||||||
err = WSAStartup( wVersionRequested, &wsaData ); | |||||||||||||||||
if ( err != 0 ) { | |||||||||||||||||
return; | |||||||||||||||||
} | |||||||||||||||||
if ( LOBYTE( wsaData.wVersion ) != 1 || | |||||||||||||||||
HIBYTE( wsaData.wVersion ) != 1 ) { | |||||||||||||||||
WSACleanup( ); | |||||||||||||||||
return; | |||||||||||||||||
} | |||||||||||||||||
SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); | |||||||||||||||||
SOCKADDR_IN addrSrv; | |||||||||||||||||
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY); | |||||||||||||||||
addrSrv.sin_family=AF_INET; | |||||||||||||||||
addrSrv.sin_port=htons(1000); | |||||||||||||||||
bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR)); | |||||||||||||||||
listen(sockSrv,5); | |||||||||||||||||
SOCKADDR_IN addrClient; | |||||||||||||||||
int len=sizeof(SOCKADDR); | |||||||||||||||||
SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len); | |||||||||||||||||
char sendBuf[100]; | |||||||||||||||||
sprintf(sendBuf,"Welcome %s to here!",inet_ntoa(addrClient.sin_addr)); | |||||||||||||||||
send(sockConn,sendBuf,strlen(sendBuf)+1,0); | |||||||||||||||||
char recvBuf[50]; | |||||||||||||||||
recv(sockConn,recvBuf,50,0); | |||||||||||||||||
//::AfxMessageBox(recvBuf); | |||||||||||||||||
DWORD dwNum = MultiByteToWideChar (CP_UTF8, 0, recvBuf, -1, NULL, 0); | |||||||||||||||||
LPWSTR pwText = new WCHAR[dwNum]; | |||||||||||||||||
MultiByteToWideChar (CP_UTF8, 0, recvBuf, -1, pwText, dwNum); | |||||||||||||||||
int nLen1 = WideCharToMultiByte( CP_ACP, 0, pwText, dwNum, NULL, NULL, NULL, NULL ); | |||||||||||||||||
char *pwTextz = new char[nLen1]; | |||||||||||||||||
WideCharToMultiByte( CP_ACP, 0, pwText, dwNum, pwTextz, nLen1, NULL, NULL ); | |||||||||||||||||
m_txt.SetWindowText(pwTextz); | |||||||||||||||||
if(!pwText) | |||||||||||||||||
{ | |||||||||||||||||
delete []pwText; | |||||||||||||||||
} | |||||||||||||||||
if(!pwTextz) | |||||||||||||||||
{ | |||||||||||||||||
delete []pwTextz; | |||||||||||||||||
} | |||||||||||||||||
m_txt.SetWindowText(pwTextz); | |||||||||||||||||
printf("%s/n",recvBuf); | |||||||||||||||||
closesocket(sockConn); | |||||||||||||||||
WSACleanup(); | |||||||||||||||||
} | |||||||||||||||||
C#客户端(发送UTF-8码): | |||||||||||||||||
两种方法实现的socket通信 | |||||||||||||||||
1.button1流的方式, | |||||||||||||||||
2.button2 常规的套接字方式。 | |||||||||||||||||
using System; | |||||||||||||||||
using System.Data; | |||||||||||||||||
using System.Configuration; | |||||||||||||||||
using System.Web; | |||||||||||||||||
using System.Web.Security; | |||||||||||||||||
using System.Web.UI; | |||||||||||||||||
using System.Web.UI.WebControls; | |||||||||||||||||
using System.Web.UI.WebControls.WebParts; | |||||||||||||||||
using System.Web.UI.HtmlControls; | |||||||||||||||||
using System.Net.Sockets; | |||||||||||||||||
using System.IO; | |||||||||||||||||
using System.Threading; | |||||||||||||||||
using System.Net; | |||||||||||||||||
using System.Text; | |||||||||||||||||
public partial class _Default : System.Web.UI.Page | |||||||||||||||||
{ | |||||||||||||||||
TcpClient myclient; | |||||||||||||||||
private NetworkStream networkStream; | |||||||||||||||||
private StreamReader streamReader; | |||||||||||||||||
private StreamWriter streamWriter; | |||||||||||||||||
private UdpClient client = new UdpClient(); //客户端 | |||||||||||||||||
private IPEndPoint serverIP; | |||||||||||||||||
protected void Page_Load(object sender, EventArgs e) | |||||||||||||||||
{ | |||||||||||||||||
} | |||||||||||||||||
protected void Button1_Click(object sender, EventArgs e) | |||||||||||||||||
{ | |||||||||||||||||
try | |||||||||||||||||
{ | |||||||||||||||||
myclient = new TcpClient("127.0.0.1", 1000); | |||||||||||||||||
} | |||||||||||||||||
catch | |||||||||||||||||
{ | |||||||||||||||||
//MessageBox.Show("没有连接到服务器!"); | |||||||||||||||||
return; | |||||||||||||||||
} | |||||||||||||||||
networkStream = myclient.GetStream(); | |||||||||||||||||
streamReader = new StreamReader(networkStream); | |||||||||||||||||
streamWriter = new StreamWriter(networkStream); | |||||||||||||||||
try | |||||||||||||||||
{ | |||||||||||||||||
String str = TextBox1.Text; | |||||||||||||||||
Encoding encoder = Encoding.UTF8; | |||||||||||||||||
byte[] buff = new byte[encoder.GetByteCount(str)]; | |||||||||||||||||
int j = encoder.GetBytes(str, 0, str.Length, buff, 0); | |||||||||||||||||
streamWriter.WriteLine(str); | |||||||||||||||||
streamWriter.Flush(); | |||||||||||||||||
string revStr = streamReader.ReadLine(); | |||||||||||||||||
//Console.Write(revStr); | |||||||||||||||||
TextBox1.Text = ""; | |||||||||||||||||
TextBox1.Text = revStr; | |||||||||||||||||
} | |||||||||||||||||
catch | |||||||||||||||||
{ | |||||||||||||||||
//MessageBox.Show("没有连接到服务器!"); | |||||||||||||||||
return; | |||||||||||||||||
} | |||||||||||||||||
streamReader.Close(); | |||||||||||||||||
streamWriter.Close(); | |||||||||||||||||
networkStream.Close(); | |||||||||||||||||
} | |||||||||||||||||
protected void Button2_Click(object sender, EventArgs e) | |||||||||||||||||
{ | |||||||||||||||||
//send("127.0.0.1","fdkas"); | |||||||||||||||||
Socket socketTest = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); | |||||||||||||||||
socketTest.Connect("127.0.0.1", 1000); | |||||||||||||||||
//byte[] test = new byte[10]; | |||||||||||||||||
//test[0] = Byte.Parse("1"); | |||||||||||||||||
//test[1] = Byte.Parse("2"); | |||||||||||||||||
//test[2] = Byte.Parse("3"); | |||||||||||||||||
//test[3] = Byte.Parse("4"); | |||||||||||||||||
//test[4] = Byte.Parse("5"); | |||||||||||||||||
//将页面中的字符串转换成UTF-8发送到服务器端 | |||||||||||||||||
String str = TextBox1.Text; | |||||||||||||||||
Encoding encoder = Encoding.UTF8; | |||||||||||||||||
byte[] buff = new byte[encoder.GetByteCount(str)]; | |||||||||||||||||
int j = encoder.GetBytes(str, 0, str.Length, buff, 0); | |||||||||||||||||
//NetworkStream networkStream = new NetworkStream(socketTest); | |||||||||||||||||
//StreamWriter streamWriter = new StreamWriter(networkStream); | |||||||||||||||||
socketTest.Send(buff); | |||||||||||||||||
} | |||||||||||||||||
public void send(string IP, string content) | |||||||||||||||||
{ | |||||||||||||||||
serverIP = new IPEndPoint(IPAddress.Parse(IP), 1000); | |||||||||||||||||
byte[] mybyte = Encoding.Default.GetBytes(content); | |||||||||||||||||
client.Send(mybyte, mybyte.Length, serverIP); | |||||||||||||||||
} | |||||||||||||||||
} | |||||||||||||||||