zoukankan      html  css  js  c++  java
  • C++ UTF-8和GBK相互转化

    转载自:https://blog.csdn.net/yfw418/article/details/1654652

    目录

      一、利用iconv命令进行编码转换

      iconv命令用于转换指定文件的编码,默认输出到标准输出设备,亦可指定输出文件。

      用法: iconv [选项...] [文件...]
      
      有如下选项可用:
      
      输入/输出格式规范:
      -f, --from-code=名称 原始文本编码
      -t, --to-code=名称 输出编码
      
      信息:
      -l, --list 列举所有已知的字符集
      
      输出控制:
      -c 从输出中忽略无效的字符
      -o, --output=FILE 输出文件
      -s, --silent 关闭警告
      --verbose 打印进度信息
      
      -?, --help 给出该系统求助列表
      --usage 给出简要的用法信息
      -V, --version 打印程序版本号
      
      例子:
      iconv -f utf-8 -t gb2312 aaa.txt >bbb.txt
      这个命令读取aaa.txt文件,从utf-8编码转换为gb2312编码,其输出定向到bbb.txt文件。
      

      二、C++代码进行编码转换

      #include <stdio.h>
      #include <stdlib.h>
      #include <locale.h>
      #include <string.h>
      
      #include <iconv.h>
      #include <iostream>
      
      #define OUTLEN 255
      
      using namespace std;
      
      // 代码转换操作类
      class CodeConverter {
      private:
          iconv_t cd;
      public:
          // 构造
          CodeConverter(const char *from_charset,const char *to_charset) {
              cd = iconv_open(to_charset,from_charset);
          }
      
          // 析构
          ~CodeConverter() {
              iconv_close(cd);
          }
      
          // 转换输出
          int convert(char *inbuf,int inlen,char *outbuf,int outlen) {
              char **pin = &inbuf;
              char **pout = &outbuf;
      
              memset(outbuf,0,outlen);
              return iconv(cd,pin,(size_t *)&inlen,pout,(size_t *)&outlen);
          }
      };
      
      void unescape(char * str)
      {
          int     pos,len=strlen(str);
          wchar_t wstr[100];
          char    code[5]={0};
          char    *_str,*p=str;
          char    out[OUTLEN];
          memset(wstr,0,sizeof(wstr));
      
          pos = 0;
          while (*p!=0)
          {
              _str = strchr(p,'%');
              memset(code,0,sizeof(code));
              if(_str[1]=='u'){
                  memcpy(code, _str+2, 4);
                  p = p + 6;
              }else{
                  memcpy(code, _str+1, 2);
                  p = p + 3;	
              }
              long tmpl = strtol(code, (char**)NULL, 16);
              printf("long:%u
      ");
              wstr[pos++] = (wchar_t)tmpl;
          }
          memset(str,0,sizeof(char)*len);
          setlocale(LC_ALL, "");
          wcstombs(str, wstr, sizeof(str)/sizeof(char));
      
          CodeConverter cc = CodeConverter("utf-8","gb2312");
          cc.convert(str,strlen(str),out,OUTLEN);
          cout << "utf-8-->gb2312 in=" << str << ",out=" << out << endl;
      
          // gb2312-->utf-8
          CodeConverter cc2 = CodeConverter("gb2312","utf-8");
          cc2.convert(str,strlen(str),out,OUTLEN);
          cout << "gb2312-->utf-8 in=" << str << ",out=" << out << endl;
      }
      int main(void)
      {
          char str[]="%u559C%u5267";
          unescape(str);
          printf("中文字符是:%s
      ", str);
          return 0;
      }
      
    • 相关阅读:
      Javascript动画模拟
      C#导出Excel
      Google Maps API
      动态管理视图和函数
      HttpWebRequest和HttpWebResponse实例
      从零开始学Java 第19章 网络编程
      从零开始学Java 第15章 Java输入输出流
      从零开始学Java 第21章 集合框架
      从零开始学Java 第13章 多线程
      从零开始学Java 第14章 Applet程序
    • 原文地址:https://www.cnblogs.com/bugutian/p/13235143.html
    Copyright © 2011-2022 走看看