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

                  
  我的思路是这样的:在配置文件(基本上使用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);             
    }                 
}                 
                  
                  
                  
                  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值