热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

utf-8转换GB3212或GBK

///////////////

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////
// CodeConvert.h: interface for the CCodeConvert class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_CODECONVERT_H__9ECD30AF_5D65_436C_95E4_E412B19529D2__INCLUDED_)
#define AFX_CODECONVERT_H__9ECD30AF_5D65_436C_95E4_E412B19529D2__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

//实现不同字符编码之间的转换
class CCodeConvert 
{
public:
 void ConvertGBKToUtf8(CString& strGBK);
 static void ConvertUtf8ToGBK(CString& strUtf8);
 static enum {
  UTF8_TO_GB2312,
  GB2312_TO_UTF8,
 };
 static void Convert(LPCTSTR srcfile, LPCTSTR destfile, DWORD dwFlag=UTF8_TO_GB2312);
 static void UTF_8ToGB2312(string& pOut,char *pText, int pLen);
 static void GB2312ToUTF_8(string& pOut,char *pText, int pLen);
 // Unicode 转换成UTF-8
 static void UnicodeToUTF_8(char* pOut,WCHAR* pText);
 // GB2312 转换成 Unicode
 static void Gb2312ToUnicode(WCHAR* pOut,char *gbBuffer);
 // 把Unicode 转换成 GB2312
 static void UnicodeToGB2312(char* pOut,unsigned short uData);
 // 把UTF-8转换成Unicode
 static void UTF_8ToUnicode(WCHAR* pOut,char* pText);
 
 CCodeConvert();
 virtual ~CCodeConvert();

};

#endif // !defined(AFX_CODECONVERT_H__9ECD30AF_5D65_436C_95E4_E412B19529D2__INCLUDED_)

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////
// CodeConvert.cpp: implementation of the CCodeConvert class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "popsvr.h"
#include "CodeConvert.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CCodeConvert::CCodeConvert()
{

}

CCodeConvert::~CCodeConvert()
{

}


void CCodeConvert::UTF_8ToUnicode(WCHAR* pOut,char *pText)
{
 char* uchar = (char *)pOut;
 
 uchar[1] = ((pText[0] & 0x0F) <<4) + ((pText[1] >> 2) & 0x0F);
 uchar[0] = ((pText[1] & 0x03) <<6) + (pText[2] & 0x3F);

 return;
}

void CCodeConvert::UnicodeToGB2312(char* pOut,unsigned short uData)
{
 //WideCharToMultiByte(CP_ACP,NULL,&uData,1,pOut,sizeof(WCHAR),NULL,NULL);
 WideCharToMultiByte(CP_ACP,WC_COMPOSITECHECK,&uData,1,pOut,sizeof(WCHAR),NULL,NULL);
 return;
}

void CCodeConvert::Gb2312ToUnicode(WCHAR* pOut,char *gbBuffer)
{
 ::MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,gbBuffer,2,pOut,1);
 return;
}

void CCodeConvert::UnicodeToUTF_8(char* pOut,WCHAR* pText)
{
 // 注意 WCHAR高低字的顺序,低字节在前,高字节在后
 char* pchar = (char *)pText;

 pOut[0] = (0xE0 | ((pchar[1] & 0xF0) >> 4));
 pOut[1] = (0x80 | ((pchar[1] & 0x0F) <<2)) + ((pchar[1] & 0xC0) >> 6);
 pOut[2] = (0x80 | (pchar[0] & 0x3F));
 
 return;
}
//  GB2312 =>UTF-8
void CCodeConvert::GB2312ToUTF_8(string& pOut,char *pText, int pLen)
{
 char buf[4];
 char* rst = new char[pLen + (pLen >> 2) + 2];
 
 memset(buf,0,4);
 memset(rst,0,pLen + (pLen >> 2) + 2);
 
 int i = 0;
 int j = 0; 
 while(i  {
  //如果是英文直接复制就可以
  if( *(pText + i) >= 0)
  {
   rst[j++] = pText[i++];
  }
  else
  {
   WCHAR pbuffer;
   Gb2312ToUnicode(&pbuffer,pText+i);
   
   UnicodeToUTF_8(buf,&pbuffer);
   
   unsigned short int tmp = 0;
   tmp = rst[j] = buf[0];
   tmp = rst[j+1] = buf[1];
   tmp = rst[j+2] = buf[2];
   
   
   j += 3;
   i += 2;
  }
 }
 rst[j] = '/0';

 //返回结果
 pOut = rst;  
 delete []rst; 
 
 return;
}
//UTF-8 => GB2312
void CCodeConvert::UTF_8ToGB2312(string &pOut, char *pText, int pLen)
{
 TRACE("/r/nCCodeConvert::UTF_8ToGB2312");
 char * newBuf = new char[pLen+1];
  newBuf[pLen]=0x00;

  char Ctemp[4];
  memset(Ctemp,0,4);

  int i =0;
  int j = 0;
  while(i   {
   if(pText[i] > 0)
  {
   newBuf[j++] = pText[i++];   
  }
  else                
  {
   WCHAR Wtemp;
   UTF_8ToUnicode(&Wtemp,pText + i);
   UnicodeToGB2312(Ctemp,Wtemp);
   newBuf[j] = Ctemp[0];
   newBuf[j + 1] = Ctemp[1];

   i += 3;   
   j += 2;  
  }
  }//end while
  newBuf[j] = '/0';
  pOut = newBuf;
  delete []newBuf;
  return;
  //////////////////////////////////////////////////////////////////////////
}
//UTF-8 => GBK
void CCodeConvert::ConvertUtf8ToGBK(CString& strUtf8)
{
 TRACE("/r/nCCodeConvert::UTF_8ToGBK");
 
 int len=MultiByteToWideChar(CP_UTF8, 0, (LPCTSTR)strUtf8, -1, NULL,0);
    unsigned short * wszGBK = new unsigned short[len+1];
    memset(wszGBK, 0, len * 2 + 2);
    MultiByteToWideChar(CP_UTF8, 0, (LPCTSTR)strUtf8, -1, wszGBK, len);

    len = WideCharToMultiByte(CP_ACP, 0, wszGBK, -1, NULL, 0, NULL, NULL);
    char *szGBK=new char[len + 1];
    memset(szGBK, 0, len + 1);
    WideCharToMultiByte (CP_ACP, 0, wszGBK, -1, szGBK, len, NULL,NULL);

    strUtf8 = szGBK;
    delete[] szGBK;
    delete[] wszGBK;
}

void CCodeConvert::Convert(LPCTSTR srcfile, LPCTSTR destfile, DWORD dwFlag)
{
 TRACE("/r/nCCodeConvert::Convert");
 CFile file(srcfile,CFile::modeReadWrite);
 DWORD nlen = file.GetLength();
 char *s = new char[nlen+1]; 
 s[nlen]=0x00;
 file.ReadHuge(s,nlen);
 file.Close();
 
 switch(dwFlag)
 {
 case 0: //UTF-8 => GB2312
  { 
   CFile newfile(destfile,CFile::modeCreate | CFile::modeWrite);
   string str;
   UTF_8ToGB2312(str,s,nlen);
   newfile.WriteHuge(str.c_str(),str.length());
   newfile.Close();
  }
  break;
 case 1://UTF-8 => GBK
  {
   CFile newfile(destfile,CFile::modeCreate | CFile::modeWrite);
   CString strBuf(' ',nlen);
   strBuf.Format("%s",s);
   ConvertUtf8ToGBK(strBuf);
   newfile.WriteHuge(strBuf.GetBuffer(0),strBuf.GetLength());
   newfile.Close();
  }
  break;
 }

 delete[] s;
}


//GBK => UTF-8
void CCodeConvert::ConvertGBKToUtf8(CString &strGBK)
{
    int len=MultiByteToWideChar(CP_ACP, 0, (LPCTSTR)strGBK, -1, NULL,0);
    unsigned short * wszUtf8 = new unsigned short[len+1];
    memset(wszUtf8, 0, len * 2 + 2);
    MultiByteToWideChar(CP_ACP, 0, (LPCTSTR)strGBK, -1, wszUtf8, len);

    len = WideCharToMultiByte(CP_UTF8, 0, wszUtf8, -1, NULL, 0, NULL, NULL);
    char *szUtf8=new char[len + 1];
    memset(szUtf8, 0, len + 1);
    WideCharToMultiByte (CP_UTF8, 0, wszUtf8, -1, szUtf8, len, NULL,NULL);

    strGBK = szUtf8;
    delete[] szUtf8;
    delete[] wszUtf8;
}
 


推荐阅读
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • 本文详细介绍了GetModuleFileName函数的用法,该函数可以用于获取当前模块所在的路径,方便进行文件操作和读取配置信息。文章通过示例代码和详细的解释,帮助读者理解和使用该函数。同时,还提供了相关的API函数声明和说明。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • SpringBoot uri统一权限管理的实现方法及步骤详解
    本文详细介绍了SpringBoot中实现uri统一权限管理的方法,包括表结构定义、自动统计URI并自动删除脏数据、程序启动加载等步骤。通过该方法可以提高系统的安全性,实现对系统任意接口的权限拦截验证。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
author-avatar
ThanksGiven
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有