linux gbk英文转unicode,linux unicode to gbk or gbk to unicode

1.关于C程序的汉字转换问题。

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

通用的方法:

linux中有iconv库,直接使用库函数,能够进行各种编码转换:

#include 

#define OUTLEN 255

#include 

#include 

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//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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值