如何将 GBK 编码的中英文特殊字符转换为十六进制
问:如何将 GBK 编码的中英文特殊字符转换为十六进制
- #include <iostream>
- #include <sstream>
- #include <stdlib.h>
- #include <string.h>
- #include <iconv.h>
- #include <stdio.h>
- #include <ctype.h>
- using namespace std;
- //编码转换,source_charset 是源编码,to_charset 是目标编码
- std::string code_convert(const char *source_charset,const char *to_charset, const std::string& sourceStr) //sourceStr 是源编码字符串
- {
- iconv_t cd = iconv_open(to_charset, source_charset);//获取转换句柄,void* 类型
- if (cd == 0)
- return (string)"";
- size_t inlen = sourceStr.size();
- size_t outlen = 1024;
- char* inbuf = (char*)sourceStr.c_str();
- char outbuf[outlen];//这里实在不知道需要多少个字节,这是个问题
- //char *outbuf = new char[outlen]; 另外outbuf不能在堆上分配内存,否则转换失败,猜测跟 iconv 函数有关
- memset(outbuf, 0, outlen);
- char *poutbuf = outbuf; //多加这个转换是为了避免 iconv 这个函数出现 char(*)[255] 类型的实参与 char** 类型的形参不兼容
- if (iconv(cd, &inbuf, &inlen, &poutbuf,&outlen) == -1)
- return (string)"";
- std::string strTemp(outbuf);//此时的 strTemp 为转换编码之后的字符串
- iconv_close(cd);
- return strTemp;
- }
- std::string Gbk_to_unicode(const std::string& strInput)
- {
- return code_convert("GBK", "UCS-2LE//IGNORE", (char*)strInput.c_str());
- }
- std::string unicode_to_Gbk(const std::string& strInput)
- {
- return code_convert("UCS-2LE", "GBK//IGNORE", (char*)strInput.c_str());
- }
- //判断是大端还是小端
- bool is_big_endian()
- {
- unsigned short test = 0x1234;
- if(*( (unsigned char*)&test ) == 0x12)
- return true;
- else
- return false;
- }
- string UnicodetoHexString(int i)
- {
- stringstream ss;
- ss << hex << i;
- return ss.str();
- }
- string toHexString(string& strInput) {
- int i = 0;
- string strResult = "";
- int num = strInput.length();
- while (i < num) {
- if (strInput[i] >= 32 && strInput[i] <= 126) //ASCII 码表值
- {
- strResult += UnicodetoHexString(strInput[i]);
- } else {
- string tmp = strInput.substr(i, 2); //中文占两个字节
- i++;
- string strUnicode = Gbk_to_unicode(tmp);
- int num = strUnicode.size();
- unsigned char* p = (unsigned char*) strUnicode.c_str();
- string strbuf[2];
- for (int i = 0; i < num; i++) {
- strbuf[i] += UnicodetoHexString(*p);
- p++;
- }
- if (is_big_endian()) //大端系统
- {
- strResult += strbuf[0] + strbuf[1];
- } else //小端系统
- {
- strResult += strbuf[1] + strbuf[0];
- }
- }
- i++;
- }
- return strResult;
- }
- int main() {
- string str = "abc中sfg国de_&%$$*f__12";
- cout << toHexString(str) << endl;
- return 0;
- }
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 中如何按列编辑 ...