如何将 GBK 编码的中英文特殊字符转换为十六进制

如何将 GBK 编码的中英文特殊字符转换为十六进制

问:如何将 GBK 编码的中英文特殊字符转换为十六进制
  1. #include <iostream>
  2. #include <sstream>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <iconv.h>
  6. #include <stdio.h>
  7. #include <ctype.h>
  8. using namespace std;


  9. //编码转换,source_charset 是源编码,to_charset 是目标编码
  10. std::string code_convert(const char *source_charset,const char *to_charset, const std::string& sourceStr) //sourceStr 是源编码字符串
  11. {
  12.     iconv_t cd = iconv_open(to_charset, source_charset);//获取转换句柄,void* 类型
  13.     if (cd == 0)
  14.         return (string)"";

  15.     size_t inlen = sourceStr.size();
  16.     size_t outlen = 1024;
  17.     char* inbuf = (char*)sourceStr.c_str();
  18.     char outbuf[outlen];//这里实在不知道需要多少个字节,这是个问题
  19.     //char *outbuf = new char[outlen]; 另外outbuf不能在堆上分配内存,否则转换失败,猜测跟 iconv 函数有关
  20.     memset(outbuf, 0, outlen);

  21.     char *poutbuf = outbuf; //多加这个转换是为了避免 iconv 这个函数出现 char(*)[255] 类型的实参与 char** 类型的形参不兼容
  22.     if (iconv(cd, &inbuf, &inlen, &poutbuf,&outlen) == -1)
  23.         return (string)"";

  24.     std::string strTemp(outbuf);//此时的 strTemp 为转换编码之后的字符串
  25.     iconv_close(cd);
  26.     return strTemp;
  27. }
  28. std::string Gbk_to_unicode(const std::string& strInput)
  29. {
  30.     return code_convert("GBK", "UCS-2LE//IGNORE", (char*)strInput.c_str());
  31. }
  32. std::string unicode_to_Gbk(const std::string& strInput)
  33. {
  34.     return code_convert("UCS-2LE", "GBK//IGNORE", (char*)strInput.c_str());
  35. }
  36. //判断是大端还是小端
  37. bool is_big_endian()
  38. {
  39.     unsigned short test = 0x1234;
  40.     if(*( (unsigned char*)&test ) == 0x12)
  41.         return true;
  42.     else
  43.         return false;
  44. }

  45. string UnicodetoHexString(int i)
  46. {
  47.     stringstream ss;
  48.     ss << hex  << i;
  49.     return ss.str();
  50. }

  51. string toHexString(string& strInput) {
  52.     int i = 0;
  53.     string strResult = "";
  54.     int num = strInput.length();
  55.     while (i < num) {
  56.         if (strInput[i] >= 32 && strInput[i] <= 126) //ASCII 码表值
  57.                 {
  58.             strResult += UnicodetoHexString(strInput[i]);
  59.         } else {
  60.             string tmp = strInput.substr(i, 2); //中文占两个字节
  61.             i++;
  62.             string strUnicode = Gbk_to_unicode(tmp);
  63.             int num = strUnicode.size();
  64.             unsigned char* p = (unsigned char*) strUnicode.c_str();
  65.             string strbuf[2];
  66.             for (int i = 0; i < num; i++) {
  67.                 strbuf[i] += UnicodetoHexString(*p);
  68.                 p++;
  69.             }
  70.             if (is_big_endian()) //大端系统
  71.             {
  72.                 strResult += strbuf[0] + strbuf[1];
  73.             } else //小端系统
  74.             {
  75.                 strResult += strbuf[1] + strbuf[0];
  76.             }
  77.         }
  78.         i++;
  79.     }
  80.     return strResult;
  81. }
  82. int main() {

  83.     string str = "abc中sfg国de_&%$$*f__12";
  84.     cout << toHexString(str) << endl;
  85.     return 0;
  86. }

    • Related Articles

    • IDE 中如何将 tab 键换成4个空格

      问:IDE 中如何将 tab 键换成4个空格? 按如下步骤操作 (1)Window -> Preferences -> Text Editors -> Insert勾选上-> OK (2)Window -> Preferences -> Formatter -> New -> Profile name -> OK (3)Window -> Preferences -> Formatter -> Edit -> Spaces only -> Indentation size:4;  Tab ...
    • 僵死状态进程如何处理

      Q: 子进程执行完或kill后,处于僵死状态(zombie),如何将其终结? A: 如果子进程退出后,通过ps命令仍能看到其存在,并且它的状态变成Z,则此子进程处于僵死状态,那如何将其正常终止呢? 在 SylixOS 中可以通过调用 wait 或者 waitpid,这样父进程可以获取子进程的退出状态,子进程也能正常终止。 即在程序中增加如下代码: child_pid = wait (&iStatLoc) 或者 waitpid(child_pid, &iStatLoc, 0);
    • RealEvo-IDE 使用手册

      RealEvo-IDE 使用手册 详见:RealEvo-IDE (SylixOS IDE)安装目录如:F:\ACOINFO\RealEvo\doc 中 doc 文件夹下的 《RealEvo-IDE使用手册》 公开链接:SylixOS 手册获取 更多 IDE 配置见: 参考文章:RealEvo-IDE 获取地址 参考文章:IDE 窗口布局介绍 参考文章:IDE 中如何高亮变量 参考文章:IDE 中如何按列编辑 参考文章:IDE 中如何显示特殊字符 参考文章:IDE 中如何屏蔽单个工程文件 ...
    • IDE 中无法实现 ctrl 跳转、索引?

      Q:IDE 中大文件无法实现 ctrl 跳转及显示索引怎么修改? 在 IDE 的菜单栏 Windows -> Preferences,然后按照图示位置进行修改,确认保存,然后重新打开文件即可。 更多 IDE 配置见: 参考文章:RealEvo-IDE 获取地址 参考文章:IDE 窗口布局介绍 参考文章:IDE 中如何高亮变量 参考文章:IDE 中如何按列编辑 参考文章:IDE 中如何显示特殊字符 参考文章:IDE 中如何屏蔽单个工程文件 参考文章:如何恢复 IDE 默认的窗口布局 ...
    • 如何修改 IDE 的内存大小配置

      问:如何修改 IDE 的内存大小配置? 目前 IDE 比较占内存,可以通过配置文件修改 IDE 占用内存限制,配置文件在:\RealEvo\ide\RealEvo-IDE.ini。 这个文件中修改 xmx768m 表示系统内存最大值为 768MB,xms256m 表示超过内存最大值 256MB 时调用 java 虚拟机的垃圾回收。 更多 IDE 配置见: 参考文章:RealEvo-IDE 获取地址 参考文章:IDE 窗口布局介绍 参考文章:IDE 中如何高亮变量 参考文章:IDE 中如何按列编辑 ...