Notes for a front-end developer, esyou.net

0%

NODEJS ADDONS 中文乱码处理

使用nodeJS的addons模块进行处理中文字符的时候,总是乱码。期间查询过很多关于C++或者C的中文乱码解决办法,但是大多都是直接在原生的C以及C++中使用,并没有专门的在V8引擎中直接使用的实例,由此我从网上拷贝了几个代码过来后,发现编译的过程中一直都是报错的,也就是说无法直接使用啊!通过跟底层开发的同事的不断努力,终于在nodeJS中搞出来了编码转换的问题,并且测试通过,代码如下:

1
int code_convert(char *from_charset,char *to_charset,char *inbuf,size_t* inlen,char *outbuf,size_t* outlen){
2
  iconv_t cd;
3
  int rc;
4
  char **pin = &inbuf;
5
  char **pout = &outbuf;
6
7
  cd = iconv_open(to_charset,from_charset);
8
  if (cd==0) return -1;
9
  std::memset(outbuf,0,(int)(*outlen));
10
  if (iconv(cd,pin,inlen,pout,outlen)==-1) return -1;
11
    iconv_close(cd);
12
    return 0;
13
}
14
//UNICODE码转为GB2312码
15
int u2g(char *inbuf,size_t* inlen,char *outbuf,size_t* outlen){
16
  return code_convert("utf-8","gb2312",inbuf,inlen,outbuf,outlen);
17
}
18
//GB2312码转为UNICODE码
19
int g2u(char *inbuf,size_t* inlen,char *outbuf,size_t* outlen){
20
  return code_convert("gb2312","utf-8",inbuf,inlen,outbuf,outlen);
21
}

使用方法

1
int inLen = strlen(ctext);
2
  size_t inLenSize,outLenSize;
3
  inLenSize = inLen;
4
  outLenSize = 256;
5
  char outBuf[outLenSize];
6
  //printline();
7
  int convLen = u2g(ctext, &inLenSize,outBuf,&outLenSize);