C语言实现GBK/GB2312/五大码之间的转换

以下四个函数分别实现:

大五码转GBK码/GBK转大五码

GB2312码转GBK码/GBK码转GB2312码

//---------------------------------------------------------------------------
// 大五码转GBK码:
void __fastcall BIG52GBK(char *szBuf)
{
  if(!strcmp(szBuf, ""))
   return;
  int nStrLen = strlen(szBuf);
  wchar_t *pws = new wchar_t[nStrLen + 1];
  try
  {
   int nReturn = MultiByteToWideChar(950, 0, szBuf, nStrLen, pws, nStrLen + 1);
   BOOL bValue = false;
   nReturn = WideCharToMultiByte(936, 0, pws, nReturn, szBuf, nStrLen + 1, "?", &bValue);
   szBuf[nReturn] = 0;
  }
  __finally
  {
   delete[] pws;
  }
}
//---------------------------------------------------------------------------
// GBK转大五码
void __fastcall GBK2BIG5(char *szBuf)
{
  if(!strcmp(szBuf, ""))
   return ;
  int nStrLen = strlen(szBuf);
  wchar_t *pws = new wchar_t[nStrLen + 1];
  try
  {
   MultiByteToWideChar(936, 0, szBuf, nStrLen, pws, nStrLen + 1);
   BOOL bValue = false;
   WideCharToMultiByte(950, 0, pws, nStrLen, szBuf, nStrLen + 1, "?", &bValue);
   szBuf[nStrLen] = 0;
  }
  __finally
  {
   delete[] pws;
  }
}
//----------------------------------------------------------------------------
// GB2312码转GBK码
void __fastcall GB2GBK(char *szBuf)
{
  if(!strcmp(szBuf, ""))
   return;
  int nStrLen = strlen(szBuf);
  WORD wLCID = MAKELCID(MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED), SORT_CHINESE_PRC);
  int nReturn = LCMapString(wLCID, LCMAP_TRADITIONAL_CHINESE, szBuf, nStrLen, NULL, 0);
  if(!nReturn)
   return;
  char *pcBuf = new char[nReturn + 1];
  try
  {
   wLCID = MAKELCID(MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED), SORT_CHINESE_PRC);
   LCMapString(wLCID, LCMAP_TRADITIONAL_CHINESE, szBuf, nReturn, pcBuf, nReturn + 1);
   strncpy(szBuf, pcBuf, nReturn);
  }
  __finally
  {
   delete[] pcBuf;
  }
}
//---------------------------------------------------------------------------
// GBK码转GB2312码
void __fastcall GBK2GB(char *szBuf)
{
  if(!strcmp(szBuf, ""))
   return;
  int nStrLen = strlen(szBuf);
  WORD wLCID = MAKELCID(MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED), SORT_CHINESE_BIG5);
  int nReturn = LCMapString(wLCID, LCMAP_SIMPLIFIED_CHINESE, szBuf, nStrLen, NULL, 0);
  if(!nReturn)
   return;
  char *pcBuf = new char[nReturn + 1];
  try
  {
   wLCID = MAKELCID(MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED), SORT_CHINESE_BIG5);
   LCMapString(wLCID, LCMAP_SIMPLIFIED_CHINESE, szBuf, nReturn, pcBuf, nReturn + 1);
   strncpy(szBuf, pcBuf, nReturn);
  }
  __finally
  {
   delete []pcBuf;
  }
}
//---------------------------------------------------------------------------
// 测试代码
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  char szBuf[255];
  // 从GB2312转到GBK
  strcpy(szBuf, Edit1->Text.c_str());
  GB2GBK(szBuf);
  Edit2->Text = String(szBuf);
  // 从GB2312转到BIG5,通过GBK中转
  strcpy(szBuf, Edit1->Text.c_str());
  GB2GBK(szBuf);
  GBK2BIG5(szBuf);
  Edit3->Text = String(szBuf);
}

时间: 2024-09-04 20:19:35

C语言实现GBK/GB2312/五大码之间的转换的相关文章

c语言-c中不同类型指针之间的转换

问题描述 c中不同类型指针之间的转换 不同类型的指针为什么可以装换,例如: void * a; char c=a; a=(void * ) &c; 指针不就是一个地址在里面么,有什么好转换的? 解决方案 指针的本质是都一样的,转换类型是让编译器知道怎么看所指向的内容. 解决方案二: 只有转换了才能通过编译 不同的指针 ++ --等结果也不同 sizeof也不同 解决方案三: 不同类型之间的转换C 不同类型指针的相互转化不同数字类型之间的转换---------------------- 解决方案四

多种语言(big5\gbk\gb2312\utf8\Shift_JIS\iso8859-1)的网页编码切换解决方案归纳_其它综合

1.response.setContentType("text/html; charset=GB2312"); 或者response.setContentType("text/html; charset=UTF-8"); charset前面留一个空格 2.头文件包含 3. 一般处理是将在网页上提交的中文转码为Unicode存储在数据库中,取出来的 时候,用自动转码(ContentType="text/html;charset=gb2312"或Co

字符编码知识:Unicode、UTF-8、ASCII、GB2312等编码之间是如何转换的?

转自:  http://apps.hi.baidu.com/share/detail/17798660 字符编码是计算机技术的基石,想要熟练使用计算机,就必须懂得字符编码的知识.不注意的人可能对这个不在意,但这些名词有时候实在让人迷惑,对想学习计算机知识的人来说,搞懂它也十分重要,我也是在学习中慢慢了解了一些这方面的知识. 1. ASCII码      在计算机内部,所有的信息最终都表示为一个二进制的字符串.每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态,这被

c语言-C语言基础 for语句这两者之间的区别

问题描述 C语言基础 for语句这两者之间的区别 include int main() { int a=1, b=3, c=0; for (a ; a < b; a++) c = c + a + a; printf("c的值为:%d", c); getchar(); return 0; } include int main() { int a, b=3, c=0; for (a=1 ; a < b; a++) c = c + a + a; printf("c的值为

C语言学习教程第五章-函数(1)

概述 在第一章中已经介绍过,C源程序是由函数组成的. 虽然在前面各章的程序中都只有一个主函数main(), 但实用程序往往由多个函数组成.函数是C源程序的基本模块, 通过对函数模块的调用实现特定的功能.C语言中的函数相当于其它高级语言的子程序. C语言不仅提供了极为丰富的库函数(如Turbo C,MS C 都提供了三百多个库函数),还允许用户建立自己定义的函数.用户可把自己的算法编成一个个相对独立的函数模块,然后用调用的方法来使用函数. 可以说C程序的全部工作都是由各式各样的函数完成的, 所以也

MFC语言中的消息和函数之间的关系

问题描述 MFC语言中的消息和函数之间的关系 MFC中的消息和函数之间的关系是什么,比如OnSize这个是一个函数吧,怎么变成消息的? 解决方案 每个窗口有一个消息循环,mfc对消息循环做了包装,通过消息映射宏将收到指定的消息调用对应的虚函数处理,你写的onsize就是这样一个函数. 解决方案二: Onsize 是窗口大小发生了改变时调用的 3个消息分别是:WM_SIZE.WM_SIZING.WM_GETMINMAXINFO:分别对应相应的处理函数:OnSize.OnSizing.OnGetMi

qq空间-C#如何登录QQ空间? 怎么易语言登得二五呢?

问题描述 C#如何登录QQ空间? 怎么易语言登得二五呢? 我想做个程序替我玩QQ空间,但不知道如何才能用C#登录QQ空间. 我在网上搜索了很长时间,探索了一下Javascript.Net.Jint.Jurassic .IronJS,小段代码可以运行,但对于加密密码的JS函数,运行总出错. 不知道怎么回事?易语言好像登得二五呢?大神们,拯救我吧! 解决方案 C#实现QQ空间登录C#之自动提交表单登录QQ空间C#之自动提交表单登录QQ空间... 解决方案二: 易语言登得二五是什么意思? C#登录qq

php中GBK/GB2312页面使用json_decode()中文丢失了解决方法

好像用json_decode()将数组/对象 序列化为JSON字符串的时候基本上只支持 UTF-8/ASCII编码.而我们有的站采用了GBK/GB2312编码,这个时候,直接使用json_encode/json_decode的时候就可能会出问题了.  代码如下 复制代码 <?php $json = '{"a":"中国人人"}'; var_dump(json_decode($json)); ?> 结果 {"text":null,&quo

c语言-c与c++输出之间的转换

问题描述 c与c++输出之间的转换 将while (scanf_s("%d%d%d", &n, &k, &m) == 3 && n)改成cin的形式怎么改 虽然我知道c++兼容c,但我想问一下用cin怎么表示上式 解决方案 while(cin>>n>>k>>m && n) 解决方案二: C/C++中字符串与数字之间的转换C/C++各种数字和字符串之间的转换函数Python和C/C++之间数据转换