`
xuela_net
  • 浏览: 495043 次
文章分类
社区版块
存档分类
最新评论

C++: 对字符串转换字符集(编码)

 
阅读更多

最近,linux上遇到string为汉字时,需要转码存入到数据库中,将转码的函数及其方法记录一下。

见函数:

头文件是#include <iconv.h>

    //fromcode:源string使用的字符集,如"UTF-8";,对于汉字每个汉字为3个字节存储
 //tocode:目的string使用的字符集,如"GB2312";,对于汉字每个汉字为2个字节存储
 //in:需要转码的字符串
 //out:转码后的字符串
    int iconv_code(const string& fromcode, const string& tocode, const string& in, string& out)
    {   
        char *sin, *sout;
        size_t lenin, lenout;
        int ret;
        iconv_t c_pt;

        if ((c_pt = iconv_open(tocode.c_str(), fromcode.c_str())) == (iconv_t)(-1)){
            out=in;
            return -1;
        }
        
        lenin = in.size()+1;//字符串要有个结束符位
        char* oldPasserName = new char[lenin];//这里oldPasserName为工作中用的名字,没什么特殊含义
        strcpy(oldPasserName, in.c_str());
        
        lenout = lenin*10;
        char* newPasserName = new char[lenout];

        sin = oldPasserName;
        sout = newPasserName;
        ret = iconv(c_pt, &sin, &lenin, &sout, &lenout);
        if(ret == -1){
            out=in;
            iconv_close(c_pt);
            return -1;
        }
        iconv_close(c_pt);
        
        out = newPasserName;
        delete []oldPasserName;//别忘记释放掉
        delete []newPasserName;
        return 0;
    }

闲话:

为什么需要转码呢,一般情况下,数据库使用GBK字符集存储,而有使用UTF-8的字符集字符串会传入应用程序,这时容易发生问题,但假如应用程序环境变量是UTF-8的,数据库如Oracle知道你传的是UTF-8字符串,它会自动帮你转码,这样不会有问题;但环境变量标明是GBK的,而应用程序传入UTF-8的汉字,那么orale会存储乱码,因为你欺骗了oracle。所以出现“欺骗”的情形时需要转码,注意自己程序是否会欺骗数据库。

同时,这个iconv函数是操作系统自己开发的库函数,而不是c++标准的,具体使用方式有可能依据系统不同而不同,我的环境是linux,所以各种linux发行版一般不会出现问题。

分享到:
评论

相关推荐

    C++ 汉字UTF-8字符串处理类库

    很多人喜欢用CString 或std:string,但是他们的缺点是不能完成汉字各种类型之间的转换,提供三种类库ascString,ucsString,utfString以及工具utfCount,utf8_ucs2_t,tcf8_ucs4_t类库,用于各种字符串之间的直接转换`...

    Visual C++.NET中的字符串转换方法.doc

    在编程中,我们常常会遇到ANSI、Unicode以及BSTR不同编码类型的字符串转换操作。本文先介绍基本字符串类型,然后说明相关的类,如CComBSTR、_bstr_t、CStringT等,最后讨论它们的转换方法,其中还包括使用最新ATL7.0...

    C/C++用的字符串繁简转换头文件,可以迅速定位转换

    //可以根据已知的字符编码以及字符集查找其在AllCode[]数组中的序号 //举例: //已知“华”的GB编码为0xBBAA,要转为Big5码。 //由于GB码是大字节序,那么如果在Little-Endian的系统上,其在内存中的值应该是0xAABB...

    CPP转Json字符串

    标准json字符串编码使用unicode,即boost 提供的 中拼接起来的字符串采用unicode字符集编码,而很多网页采用编码为utf8。 这个库字符编码采用系统编码,系统采用utf8字符集的话拼接起来字符串就是ut8了;另外在博客...

    C++代码中字符转换为Unicode

    在以前用VC++ 编写程序的时候,没有注意以后采用Unicode字符集,程序中出现的大量字符串需要添加 _T()才能正常编译,这是一个很庞大的工作,因此自己写了一个工具来实现自动转换,在使用时请您首先备份自己的代码...

    深入理解C++11:C++11新特性解析与应用

    2748.3.1 字符集、编码和Unicode 2748.3.2 C++11中的Unicode支持 2768.3.3 关于Unicode的库支持 2808.4 原生字符串字面量 2848.5 本章小结 286附录A C++11对其他标准的不兼容项目 287附录B 弃用的特性 294附录C ...

    GBK和UTF-16编码的转换接口

    包含GBK和UTF16字符集的对照表,用于将GBK字节流和UTF字符串之间的互相转换。

    二叉树的应用—哈夫曼树

    这一问题可转化为如何将传送字符集设计一套二进制编码,如何使电文总长 最短且不产生二义性。 [实验目的] (1) 掌握二叉树的静态链表表示法; (2) 掌握二叉树的哈夫曼算法; (3) 运用哈夫曼算法解决实际问题。...

    Visual C++ 2005入门经典--源代码及课后练习答案

    4.1.4 字符数组和字符串处理 147 4.1.5 多维数组 150 4.2 间接数据存取 153 4.2.1 指针的概念 153 4.2.2 声明指针 154 4.2.3 使用指针 155 4.2.4 初始化指针 157 4.2.5 sizeof运算符 162 4.2.6 ...

    URL编码转换,escape() encodeURI() encodeURIComponent()

    escape() 方法:采用ISO Latin字符集对指定的字符串进行编码。所有的空格符、标点符号、特殊字符以及其他非ASCII字符都将被转化成%xx格式的字符编码(xx等于该字符在字符集表里面的编码的16进制数字)。比如,空格...

    VC.NET使用BIG5字符集显示文字字符串

    摘要:VC/C++源码,报表打印,字符串,BIG5,繁简转换 使用BIG5显示一个字符串,也就是用繁体编码去显示简写汉字,类似繁简转换的小程序,输入的是简体字,但是是用Big字符集来显示,有可能汉字都变成繁体了。

    谭浩强C语言程序设计,C++程序设计,严蔚敏数据结构,高一凡数据结构算法分析与实现.rar

    *5.6 C++处理字符串的方法——字符串类与字符串变量 5.6.1 字符串变量的定义和引用 5.6.2 字符串变量的运算 5.6.3 字符串数组 5.6.4 字符串运算举例 习题 第6章 指针 6.1 指针的概念 6.2 变量与指针 6.2.1 定义...

    Absolute C++中文版(原书第2版)-完美的C++教程,文档中还包含英文版

    9.3.4 string类对象和C字符串的相互转换 273 第10章 指针和动态数组 280 10.1 指针 280 10.1.1 指针变量 280 10.1.2 内存管理基础 287 10.1.3 动态变量和自动变量 289 10.1.4 指针的应用 292 10.2 动态数组 ...

    C++实现56dxw短信验证码WebService接口--

    (1)设置项目属性 设置 不使用预编译头 和 使用 Unicode 字符集(是否使用UNICODE根据项目实际情况,只要注意字符串转换) (2)项目中添加以下文件:注意,这些文件都是通过gsoap自动生成,无须修改。 stdsoap2....

    VC++6.0核心编程源码.rar

    当然,你首先必须自己转换字符串,然后将已转换的消息表资源嵌入你的.exe文件或DLL模块,不过,这时该函数会选定正确的嵌入对象。ErrorShow示例应用程序(本章后面将加以介绍)展示了如何调用该函数,以便将...

    谭浩强C语言程序设计,C++程序设计,严蔚敏数据结构,高一凡数据结构算法分析与实现.rar )

    *5.6 C++处理字符串的方法——字符串类与字符串变量 5.6.1 字符串变量的定义和引用 5.6.2 字符串变量的运算 5.6.3 字符串数组 5.6.4 字符串运算举例 习题 第6章 指针 6.1 指针的概念 6.2 变量与指针 6.2.1 定义...

    C++Builder精彩编程实例集锦的源代码后3部分.rar

    实例073 如何将全角字符串转换成半角字符串 实例074 如何按照指定的有效位数转换数字 实例075 如何获取汉字的拼音索引 实例076 如何设置输入方法 实例077 如何控制数据输入格式 实例078 如何控制编辑框中的...

    cpp-utilities:我的应用程序使用的常见C ++类和例程,例如参数解析器,IO和转换实用程序

    常见的字符串转换/操作,例如 通过iconv进行字符集转换 拆分,加入,查找和替换 从数字到字符串的转换,反之亦然 编码/解码base-64 没有多个堆分配的构建字符串(“字符串生成器”) 使用标准IO流 读取/写入各种大小...

    C++Builder精彩编程实例集锦的源代码前3部分.rar

    实例073 如何将全角字符串转换成半角字符串 实例074 如何按照指定的有效位数转换数字 实例075 如何获取汉字的拼音索引 实例076 如何设置输入方法 实例077 如何控制数据输入格式 实例078 如何控制编辑框中的...

Global site tag (gtag.js) - Google Analytics