linux unicode to gbk or gbk to unicode

来源:互联网 发布:质数c语言 编辑:程序博客网 时间:2024/06/05 15:05
刚接触linux 就遇到了汉字编码转换的问题,C编程将含有汉字的数据插入ORACLE和MYSQL数据库,整整折腾了我一个星期,终于解决了。具体原理我也不知道。但是至少解决了问题。

1.关于C程序的汉字转换问题。
//================================================================================================
通用的方法:

linux中有iconv库,直接使用库函数,能够进行各种编码转换:
#include <iconv.h>
#define OUTLEN 255
#include <stdlib.h>
#include <stdio.h>


int code_convert(char *from_charset,char *to_charset,char *inbuf,int inlen,char *outbuf,int 

outlen)
{
iconv_t cd;

char **pin &inbuf;
char **pout &outbuf;

cd iconv_open(to_charset,from_charset);
if (cd==0) return -1;
memset(outbuf,0,outlen);
if (iconv(cd,pin,&inlen,pout,&outlen)==-1) return -1;
iconv_close(cd);
return 0;
}
//UNICODE码转为GB2312码
int u2g(char *inbuf,int inlen,char *outbuf,int outlen)
{
return code_convert("unicode","gb2312",inbuf,inlen,outbuf,outlen);
}
//GB2312码转为UNICODE码
int g2u(char *inbuf,size_t inlen,char *outbuf,size_t outlen)
{
return code_convert("gb2312","unicode",inbuf,inlen,outbuf,outlen);
}

以上的iconv库并不能在我的AIX64位上使用,原因未知,因为版本不同,库函数不同,不能兼容
//================================================================================================

因此,受到很大的环境限制,如果系统不提供兼容的libiconv库,又无法自己安装库的话,有下面的方法可以使用,函数都来自于c标准库。
//================================================================================================
以下均以汉字“线”为例,其unicode编码0x7EBF,GB2312编码0xCFDF,UTF8编码0xE7 0xBA 0xBF
我的代码是从另一个模块直接能获取到汉字的unicode编码,所以不需要汉字转换unicode这个过程,直接将unicode编码转换为utf8编码:
#include<locale.h>//c标准库函数

setlocale()这个函数是转换的基础

//=========================unicode------>gb2312===========================
setlocale(LC_ALL,"zh_CN.GB2312")//这个很重要,将编码格式设置为GB2312编码。
wchar_t pw=0x7EBF;//汉字"线"的unicode编码
char pw2c[5];
//wcstombs()关键函数
size_t size_pw2c = strlen(pw2c);
wcstombs(pw2c, pw, size_pw2c);//size_pw2c,存放转换的GB2312编码长度
printf("%x,%x\n", pw2c[0], pw2c[1]);
//输出为ffffffcf,ffffffdf;即0xCF,0xDF----GB2312编码
//=========================unicode------>gb2312============================


//========================gb2312------->unicode==========================
setlocale(LC_ALL,"zh_CN.GB2312")//这个很重要,将编码格式设置为GB2312编码。
char pc[3];
pc[0] = 0xCF;
pc[1] = 0xDF;
wchar_t pc2w;
size_t size_pc2w = sizeof(pc2w)/sizeof(wchar_t);
mbstowcs(pc2w, pc, size_pc2w);
printf("%x\n", pc2w);
//输出为7ebf, 即0x7EBF, unicode编码
//==========================gb2312------->unicode==========================

//========================汉字转utf8=======================================
setlocale(LC_ALL,"zh_CN.utf8")//这个很重要,或者设置为zh_CN.GB2312也可以
//以下方式赋值,本就是utf8编码
char *pc = "线";
printf("%x, %x, %x\n", pc[0],pc[1], pc[2]);
//以下方式wchar_t类型的汉字,转为char类型
wchar_t *pw = L"线";
char pw2c[3];
wcstombs(pw2c,pw, 2);
printf("%x, %x, %x\n", pw2c[0],pw2c[1], pw2c[2]);
//输出为:ffffffe7,ffffffba,ffffffbf即 0xE7, 0xBA, 0xBF
//========================汉字转utf8=======================================

//===========================utf8----->unicode==============================
setlocale(LC_ALL,"zh_CN.utf8")//这个很重要
//char类型的汉字转换为wchar_t类型的汉字
char *pc = "线";
wchar_t pc2w;
mbstowcs(pc2w, pc, 1);
printf("%x", pc2w);
//输出为7ebf
//============================utf8----->unicode=============================

2.通过测试,MYSQL服务器端,可以接受utf8和GB2312两种中文编码,都可以转换不乱吗的汉字。MYSQL服务器端对于my.ini(window)或者my.cnf(linux)文件中加入字符集设置:

在shell输入mysql登陆后:

mysql>show variables like '%char%';

回车后显示:

+----------------------+---------------------
| Variable_name | Value
+-----------------------+---------------------
| character_set_client | latin1
| character_set_connection | latin1
| character_set_database | latin1
| character_set_filesystem | binary
| character_set_results | latin1
| character_set_server | latin1
| character_set_system | utf8
| character_sets_dir | /usr/share/mysql/charsets/
+---------------------+----------------------

这就是它默认的设置。

接下来到/usr/share/mysql/目录下,将my-medium.cnf文件(使用其它实例配置文件也行)拷贝到/etc目录下:

pds:~# cp /usr/share/mysql/my-medium.cnf /etc/my.cnf
pds:~# vi /etc/my.cnf

分别在如下几项中添加字符集:

[client]
default-character-set=utf8
[mysqld_safe]
default-character-set=utf8
[mysqld]
default-character-set=utf8
#default-table-type=innodb
[mysql]
default-character-set=utf8

再重启mysql让配置生效:

//====================================================================

3.oracle数据库,编程插入中文,我的环境,有window和AIX数据库,只接受gb2312的编码插入,因此有必要将unicode转换为gb2312编码

试过了各种方法,包括改变程序端的编码方式,用过一下方法,都失败了:
/root/.bash_profile,
/etc/sysconfig/.i18n
等设置环境变量,LANG = ,LC_ALL=连系统语言都改变了,都不能改变c程序中对汉字的编码。由于只需要插入到数据库,不需要在程序控制台输出,所以不必改变这些环境变量
0 0
原创粉丝点击