libiconv gbk utf-8 转 unicode

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "iconv.h"

#define CODE_UNICODE "UCS-2LE"

int code_convert(const char *pFromCharset, const char *pToCharset, char *pInBuf, size_t nInLen, char *pOutBuf, size_t nOutLen)
{
    iconv_t cd;
    int rc;
    /* 防止指针偏移. */
    char **pin = &pInBuf;
    char **pout = &pOutBuf;

    cd = iconv_open(pToCharset, pFromCharset);
    if (cd == 0) {
        printf("iconv_open err! %s to %s\n", pFromCharset, pToCharset);
        return -1;
    }
    memset(pOutBuf, 0, nOutLen);
    if (iconv(cd, pin, &nInLen, pout, &nOutLen) == -1)
    {
        printf("iconv err! %s to %s\n", pFromCharset, pToCharset);
        return -2;
    }
    iconv_close(cd);

    return 0;
}

int codeToConvert(const char *pFromCharset, const char *pToCharset, char *pInBuf, int nInLen, char *pOutBuf, int nOutLen)
{
    char *tmpBuf = (char*)malloc(nOutLen);

    if (!tmpBuf)
    {
        printf("invalid params!\n");
        return -1;
    }
    int nRet = code_convert(pFromCharset, pToCharset, pInBuf, nInLen, tmpBuf, nOutLen);
    if (0 == nRet)
    {
        memset(pOutBuf, 0, nOutLen);
        for (int i = 0; i < nOutLen; ++i)
        {
            if (i % 2 == 0 && *(short*)(tmpBuf + i) == 0)
                break;
            sprintf(pOutBuf + 2 * i, "%02x", tmpBuf[i] & 0xff);
        }
    }
    free(tmpBuf);
    tmpBuf = NULL;

    return nRet;
}

int utf8ToUnicode(char *pInBuf, int nInLen, char *pOutBuf, int nOutLen)
{
    return codeToConvert("UTF-8", CODE_UNICODE , pInBuf, nInLen, pOutBuf, nOutLen);
}

int gbkToUnicode(char *pInBuf, int nInLen, char *pOutBuf, int nOutLen)
{
    return codeToConvert("GBK", CODE_UNICODE, pInBuf, nInLen, pOutBuf, nOutLen);
}

int main()
{
    char inbuf[] = "欢迎你好,hello world!";
    char outbuf[128] = { 0 };

    utf8ToUnicode(inbuf, strlen(inbuf), outbuf, sizeof(outbuf));
    printf("utf-8 to unicode out: %s\n", outbuf);

    gbkToUnicode(inbuf, strlen(inbuf), outbuf, sizeof(outbuf));
    printf("gbk to unicode out: %s\n", outbuf);
}

原文地址:https://www.cnblogs.com/zbs337650377/p/11766183.html

时间: 2024-10-11 16:22:13

libiconv gbk utf-8 转 unicode的相关文章

(转载)GBK、UTF8、UNICODE编码转换

GBK.UTF8.UNICODE编码转换 1 string GBKToUTF8(const std::string& strGBK) 2 { 3 int nLen = MultiByteToWideChar(CP_ACP, 0, strGBK.c_str(), -1, NULL, 0); 4 WCHAR * wszUTF8 = new WCHAR[nLen]; 5 MultiByteToWideChar(CP_ACP, 0, strGBK.c_str(), -1, wszUTF8, nLen);

文字编码ASCII,GB2312,GBK,GB18030,UNICODE,UCS,UTF的解析

众所周知,一个文字从输入到显示到存储是有一个固定过程的,其过程为:输入码(根据输入法不同而不同)→机内码(根据语言环境不同而不同,不同的系统语言编码也不一样)→字型码(根据不同的字体而不同)→存储码(根据保存的编码类型不同而不同).不同的存储码之间又有什么异同呢? 一.ASCII系列编码 首先来说明ASCII码(American Standard Code for Information Interchange,美国标准信息交换码),这个编码的时代就久远了,是由美国国家标准局(ANSI)制定,目

关于编码的发展演变:ASCII、GB2312、GBK、gb18030、Unicode、UTF-8

[1]ASCII 每个字符占据1bytes(字节),第一次以规范标准发表是在1967年,最后一次修订是在1986年.用二进制表示的话最高位必须为0(扩展的ASCII不在考虑范围内),因此ASCII只能表示128个字 [2]GB2312 最早一版的中文编码(1980年),每个字占据2bytes.由于要和ASCII兼容,那这2bytes最高位不可以为0了(否则和ASCII会有冲突).在GB2312中收录了6763个汉字以及682个特殊符号,已经囊括了生活中最常用的所有汉字. [3]GBK 由于GB2

Unicode、UTF-8 和 ISO8859-1到底有什么区别

说明:本文转载于新浪博客,旨在方便知识总结.原文地址:http://blog.sina.com.cn/s/blog_673c81990100t1lc.html 本文主要包括以下几个方面:编码基本知识,java,系统软件,url,工具软件等. 在下面的描述中,将以"中文"两个字为例,经查表可以知道其GB2312编码是"d6d0 cec4",Unicode编码为"4e2d 6587",UTF编码就是"e4b8ad e69687".

qt中文格式GBK.UTF-8,unicode 之间的转换

QTextCodec *gbk = QTextCodec::codecForName("GB18030");QTextCodec *utf8 = QTextCodec::codecForName("UTF-8");QString g2u = gbk->toUnicode(m_pUserSpi.m_mapInstruments.find(str1.toStdString())->second->InstrumentName); QString as

Python中GBK, UTF-8和Unicode的编码问题

编码问题,一直是使用python2时的一块心病.几乎所有的控制台输入输出.IO操作和HTTP操作都会涉及如下的编码问题: UnicodeDecodeError:‘ascii’codec can’t decodebyte0xc4inposition10:ordinalnotinrange(128) 这究竟是是个什么东西?!有时稀里糊涂地用一坨encode(),decode()之类的函数让程序能跑对了,可是下次遇到非ASCII编码时又悲剧了. 那么Python 2.x中的字符串究竟是个什么呢? 基本

字符编码ascii、unicode、utf-&#173;‐8、gbk 的关系

ASIIC码: 计算机是美国人发明和最早使用的,他们为了解决计算机处理字符串的问题,就将数字字母和一些常用的符号做成了一套编码,这个编码就是ASIIC码.ASIIC码包括数字大小写字母和常用符号,一共128个,1字节(byte)=8bit,8bit能表示的最大数是256,所以ASIIC编码中一个字符的大小就是1个字节 Unicode编码: 计算机进入中国后,ASIIC完全不够用,于是我们就制定了自己的GB2312编码,把汉字编码了进去.类似的在各国都有相同的情况,各国都开始制定自己的一套编码,计

字符编码ascii、unicode、utf-8、gbk 的关系

ASCII码: 计算机是美国人发明和最早使用的,他们为了解决计算机处理字符串的问题,就将数字字母和一些常用的符号做成了一套编码,这个编码就是ASCII码.ASC码II包括数字大小写字母和常用符号,一共128个,1字节(Byte)=8bit,8bit能表示的最大数是256,所以ASIIC编码中一个字符的大小就是1Byte Unicode编码: 计算机进入中国后,ASCII完全不够用,于是我们就制定了自己的GB2312编码,把汉字编码了进去.类似的在各国都有相同的情况,各国都开始制定自己的一套编码,

Unicode代码点与编码方式

一.Unicode字符集 UTF编码,全称是Unicode Transformer Format,这种编码是UCS(Universal Mutiple-Octet Doded Character Set,国际标准ISO10646规定的通用字符集)的实际形式,它的分类是按照其基本长度所占用的位数而定,分为UTF-8/16/32三种形式.UTF可以说是其他字符集的集合,它使得其它字符集是交叉兼容的,可以说,凡是将文字符号转为UCS后再转回原来的编码,也不会丢失信息.UCS包含了现在所有的已知语言的字