中文字符串在c/c++中表示为字节序列,在分词的时候需要根据不同的编码方式进行分词,一般分词器需要转换成统一的编码方式再进行转换,有些分词器如ICTCLAS在分词的时候可以不显示定义编码方式,可以检测字符串的编码方式再进行转换,本文就项目中用到的几种编码转换方式进行总结,主要利用了iconv进行编码转换。

const bchar_t zero[1] = {L'\0'}; void gbk_utf16le(char* inbuf, size_t inlen, char* outbuf) { iconv_t cd = iconv_open( "UTF-16LE//IGNORE", "GBK"); bzero( outbuf, inlen*4); char *in = inbuf; char *out = outbuf; size_t outlen = inlen*4; iconv(cd, &in, (size_t *)&inlen, &out,&outlen); if( outlen>=sizeof(bchar_t) ) *((bchar_t *) out) = L'\0'; iconv_close(cd); } void utf16le_gbk(char* inbuf, size_t inlen, char* outbuf) { iconv_t cd = iconv_open( "GBK//IGNORE", "UTF-16LE"); bzero( outbuf, inlen*4); char *in = inbuf; char *out = outbuf; size_t outlen = inlen*4; iconv(cd, &in, (size_t *)&inlen, &out,&outlen); if( outlen>=sizeof(char) ) *((char *) out) = '\0'; iconv_close(cd); } void utf16le_utf8(char* inbuf, size_t inlen, char* outbuf) { iconv_t cd = iconv_open( "UTF-8//IGNORE", "UTF-16LE"); bzero( outbuf, inlen*4); char *in = inbuf; char *out = outbuf; size_t outlen = inlen*4; iconv(cd, &in, (size_t *)&inlen, &out,&outlen); if( outlen>=sizeof(char) ) *((char *) out) = '\0'; iconv_close(cd); } void gbk_utf16le(char* inbuf, size_t inlen, char* outbuf,uint32_t& outbuflen) { iconv_t cd = iconv_open( "UTF-16LE//IGNORE", "GBK"); bzero( outbuf, inlen*4); char *in = inbuf; char *out = outbuf; size_t outlen = inlen*4; outbuflen = outlen; iconv(cd, &in, (size_t *)&inlen, &out,&outlen); //outlen is bytes of outbuf not used outbuflen -= outlen; if( outlen>=sizeof(bchar_t) ) *((bchar_t *) out) = L'\0'; iconv_close(cd); } void utf8_gbk(char* inbuf, size_t inlen, char* outbuf) { iconv_t cd = iconv_open( "GBK//IGNORE", "UTF-8"); bzero( outbuf, inlen*4); char *in = inbuf; char *out = outbuf; size_t outlen = inlen*4; iconv(cd, &in, (size_t *)&inlen, &out,&outlen); if( outlen>=sizeof(char) ) *((char *) out) = '\0'; iconv_close(cd); } /*将char类型转换为uint16类型,主要是将2个字节的char拼成1个16进制数*/ void ch_uint16(char* inbuf, int& inlen, uint16_t* outbuf, int& outlen) { char *in = inbuf; uint16_t *out = outbuf; int k = 0; outlen = 0; char temp[20]; memset(temp,0,20); for(;k+2<=inlen;k+=2){ if( int(in[k]&0xFF) >15){ sprintf(temp,"%x%x",in[k+1]&0xFF ,in[k]&0xFF);} else{ sprintf(temp,"%x%d%x",in[k+1]&0xFF,0,in[k]&0xFF);} uint16_t ut; sscanf(temp,"%x",&ut); out[outlen] = ut ; outlen++ ; } out[outlen] = L'\0'; }

中文字符串的编码转换(c实现)的更多相关文章

  1. 中文字体css编码转换

    各大网站的字体选择 网站 字体 腾讯 font: 12px "宋体","Arial Narrow",HELVETICA; 淘宝 font: 12px/1.5 t ...

  2. C#中的字符串及其编码转换

    (转自:http://blog.sina.com.cn/s/blog_498eab7d0100et7j.html) 根据查找的System.Text.Encoding类的属性,方法写了如下的转换程序: ...

  3. 字符串js编码转换成实体html编码的方法(防范XSS攻击)

    js代码在html页面中转换成实体html编码的方法一: <!DOCTYPE html><html> <head>    <title>js代码转换成实 ...

  4. JAVA字符串编码转换常用类

    无论是对程序的本地化还是国际化,都会涉及到字符编码的转换的问题.尤其在web应用中常常需要处理中文字符,这时就需要进行字符串的编码转换,将字符串编码转换为GBK或者GB2312.一.关键技术点:    ...

  5. java字符串应用之字符串编码转换

    [转载]原文地址:https://blog.csdn.net/zhouyong80/article/details/1900100 无论是对程序的本地化还是国际化,都会涉及到字符编码的转换的问题.尤其 ...

  6. 35 编码 ASCII Unicode UTF-8 ,字符串的编码、io流的编码

    * 编码表: * 信息在计算机上是用二进制表示的,这种表示法让人理解就很困难.为保证人类和设备,设备和计算机之间能进行正确的信息交换,人们编制的统一的信息交换代码,这就是ASCII码表 *ASCII ...

  7. HTML5 Blob与ArrayBuffer、TypeArray和字符串String之间转换

    1.将String字符串转换成Blob对象 //将字符串 转换成 Blob 对象 var blob = new Blob(["Hello World!"], { type: 'te ...

  8. [转] HTML5 Blob与ArrayBuffer、TypeArray和字符串String之间转换

    1.将String字符串转换成Blob对象 //将字符串 转换成 Blob 对象 var blob = new Blob(["Hello World!"], { type: 'te ...

  9. php字符编码转换中的iconv与mb_convert_encoding用法

    iconv ( 'UTF-8' , 'GBK' , $str ); //将$str字符串 utf-8 编码转换成 gbk: 另外,5.4.0 这个版本起,字符非法时候会返回 FALSE,除非在输出字符 ...

随机推荐

  1. jquery的插件机制

    jQuery的内核; (function( window, undefined ) { //这就是jQuery的原型 var jQuery = function( selector, context ...

  2. pyes-elasticsearch的python客户端使用笔记

    elasticsearch入门:  http://www.qwolf.com/?p=1387 一.重要的概念 http://834945712.iteye.com/blog/1915432 这篇文章很 ...

  3. SORT_AREA_RETAINED_SIZE

    manual pga: SORT_AREA_RETAINED_SIZE specifies (in bytes) the maximum amount of the user global area ...

  4. EntityFramework动态组合多排序字段

    前言:在使用EF当中,肯定会遇到动态查询的需求,建立一个公共调用的动态组合表达式查询也是必不可少的,以下是建立动态组合多排序字段做个记录,供以后调用 1.建立一个结构,用于多个排序字段组合,这个结构体 ...

  5. 个人学习笔记--MyBatis官方推荐DAO开发方案

    1.导入Jar包 2.编写全局配置文件configuration.xml <?xml version="1.0" encoding="UTF-8" ?&g ...

  6. python常用函数之--求绝对值函数:abs(x)

    python中的求绝对值函数:abs(X) 1. 参数 x 可以是整形也可以是复数,假如是复数的话,就求复数的模. >>> # 整形数字 ... >>> a = 1 ...

  7. python JSON处理

    概念 序列化(Serialization):将对象的状态信息转换为可以存储或可以通过网络传输的过程,传输的格式可以是JSON.XML等. 反序列化:就是从存储区域(JSON,XML)读取反序列化对象的 ...

  8. SCU3502 The Almost Lucky Number

    Description A lucky number is a number whose decimal representation contains only the digits \(4\) a ...

  9. BZOJ 1692: [Usaco2007 Dec]队列变换

    Description FJ打算带他的N(1 <= N <= 30,000)头奶牛去参加一年一度的"全美农场主大奖赛".在这场比赛中,每个参赛者都必须让他的奶牛排成一列 ...

  10. hdu 4739

    一个超级超级水的题,不明白当时比赛的时候没有出来: 思路很简单,dfs暴力一下就行,枚举每个顶点,题目一共才20个点,就是20^4方的时间复杂度,完全可以承受: 代码: #include<cst ...