中文字符串在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 之 .stop() 方法

    总结version 1.7版本前.stop([clearQueue][,jumpToEnd])clearQueue: 布尔值,默认是 false;此值处理是相关的动画队列是否移除,如果为 false ...

  2. wpf采用Xps实现文档显示、套打功能(原创)

    近期的一个项目需对数据进行套打,用户要求现场不允许安装office.页面预览显示必须要与文档完全一致,xps文档来对数据进行处理.Wpf的DocumentView 控件可以直接将数据进行显示,xps也 ...

  3. 移动端开发(使用webuploader上传图片,客户端交互,修改alert弹窗等)

    之前实习做的一个移动端的页面 需要的功能有图片上传 点击客户端的返回按钮 有提示(即与客户端有交互) 遇到不少的坑 总结一下问题 1.图片上传功能  使用工具 百度的webuploader 暂时遇到的 ...

  4. 深度学习算法实践15---堆叠去噪自动编码机(SdA)原理及实现

    我们讨论了去噪自动编码机(dA),并讨论了Theano框架实现的细节.在本节中,我们将讨论去噪自动编码机(dA)的主要应用,即组成堆叠自动编码机(SdA),我们将以MNIST手写字母识别为例,用堆叠自 ...

  5. php中CURL技术模拟登陆抓取数据实战,抓取某校教务处学生成绩。

    这两天有基友要php中curl抓取教务处成绩的源码,用于微信公众平台的开发.下面笔者只好忍痛割爱了.php中CURL技术模拟登陆抓取数据实战,抓取沈阳工学院教务处学生成绩. 首先,教务处登录需要验证码 ...

  6. osg学习笔记2, 命令行参数解析器ArgumentParser

    ArgumentParser主要负责命令行参数的读取 #include <osgDB/ReadFile> #include <osgViewer/Viewer> int mai ...

  7. STM32学习内容和计划

    一.STM32学习内容(流程) 1.学习STM32开发流程 ①MDK使用.建立工程.调试等 ②库开发方法 2.学习STM32常用外设开发 ①GPIO ②中断 ③定时器 ④串口 ⑤CAN 3.学习STM ...

  8. LightOj_1317 Throwing Balls into the Baskets

    题目链接 题意: 有N个人, M个篮框, 每个人投进球的概率是P. 问每个人投K次后, 进球数的期望. 思路: 每个人都是相互独立的, 求出一个人进球数的期望即可. 进球数和篮框的选择貌似没有什么关系 ...

  9. 使用XmlDocument.SelectNodes遍历xml元素遇到的一个XPathException

    使用XmlDocument类时候报错: 未处理的XPathException:需要命名空间管理器或 XsltContext.此查询具有前缀.变量或用户定义的函数. 需要使用XmlNamespaceMa ...

  10. Java ,单实例 多线程 ,web容器,servlet与struts1-2.x系列,线程安全的解决

    1.Servlet是如何处理多个请求同时访问呢? 回答:servlet是默认采用单实例,多线程的方式进行.只要webapp被发布到web容器中的时候,servlet只会在发布的时候实例化一次,serv ...