您的位置:首页 > 编程语言 > C语言/C++

UTF-8到acsii的转换(让自己的C++程序支持多语言)

2009-07-23 11:10 549 查看
 我的思路是这样的:在配置文件(基本上使用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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: