精华内容
下载资源
问答
  • 下面小编就为大家带来一篇Linux下实现UTF-8和GB2312互相转换的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧,祝大家游戏愉快哦
  • //================================================================================================通用的方法:linux中有iconv库,直接使用库函数,能够进行各种编码转换:#include#defineOUTLEN255#include#...

    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程序中对汉字的编码。由于只需要插入到数据库,不需要在程序控制台输出,所以不必改变这些环境变量

    展开全文
  • 利用iconv进行GB2312Unicode的互

    千次阅读 2016-03-16 16:38:03
    LINUX上进行编码转换时,既可以利用iconv函数族编程实现,也可以利用iconv命令来实现,只不过后者是针对文件的,即将指定文件从一种编码转换为另一种编码。 iconv函数族的头文件是iconv.h,使用前需包含之。 #include ...
    利用
    iconv
    函数族进行编码转换
    
    LINUX 上进行编码转换时 , 既可以利用 iconv 函数族编程实现 , 也可以利用 iconv 命令来实现 , 只不过后者是针对文件的 , 即将指定文件从一种编码转换为另一种编码。

    iconv
    函数族的头文件是 iconv.h, 使用前需包含之。
    #include
    iconv
    函数族有三个函数 , 原型如下 :
    (1) iconv_t iconv_open(const char *tocode, const char *fromcode);
    此函数说明将要进行哪两种编码的转换 ,tocode 是目标编码 ,fromcode 是原编码 , 该函数返回一个转换句柄 , 供以下两个函数使用。
    (2) size_t iconv(iconv_t cd,char **inbuf,size_t *inbytesleft,char**outbuf,size_t *outbytesleft);
    此函数从 inbuf 中读取字符 , 转换后输出到 outbuf ,inbytesleft 用以记录还未转换的字符数 ,outbytesleft 用以记录输出缓冲的剩余空间。 (3) inticonv_close(iconv_t cd);
    此函数用于关闭转换句柄 , 释放资源。
    例子 1: C 语言实现的转换示例程序

    
    #define OUTLEN 255
    main()
    {
    char *in_utf8 = "姝e?ㄥ??瑁?";
    char *in_gb2312 = "正在安装";
    char out[OUTLEN];
    
    //unicode码转为gb2312码
    rc = u2g(in_utf8,strlen(in_utf,out,OUTLEN);
    printf("unicode-->gb2312 out=%sn",out);
    //gb2312码转为unicode码
    rc = g2u(in_gb2312,strlen(in_gb2312),out,OUTLEN);
    printf("gb2312-->unicode out=%sn",out);
    }
    //代码转换:从一种编码转为另一种编码
    int code_convert(char *from_charset,char *to_charset,char *inbuf,int inlen,char*outbuf,int outlen)
    {
    iconv_t cd;
    int rc;
    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("utf-8","gb2312",inbuf,inlen,outbuf,outlen);
    }
    //GB2312码转为UNICODE码
    int g2u(char *inbuf,size_t inlen,char *outbuf,size_t outlen)
    {
    returncode_convert("gb2312","utf-8",inbuf,inlen,outbuf,outlen);
    }



    例子 2: C++ 语言实现的转换示例程序

    #define OUTLEN 255
    
    using namespace std;
    
    // 代码转换操作类
    class CodeConverter {
    private:
    iconv_t cd;
    public:
    // 构造
    CodeConverter(const char *from_charset,const char *to_charset) {
    cd = iconv_open(to_charset,from_charset);
    }
    
    // 析构
    ~CodeConverter() {
    iconv_close(cd);
    }
    
    // 转换输出
    int convert(char *inbuf,int inlen,char *outbuf,int outlen) {
    char **pin = &inbuf;
    char **pout = &outbuf;
    
    memset(outbuf,0,outlen);
    return iconv(cd,pin,(size_t *)&inlen,pout,(size_t *)&outlen);
    }
    };
    
    int main(int argc, char **argv)
    {
    char *in_utf8 = "姝e?ㄥ??瑁?";
    char *in_gb2312 = "正在安装";
    char out[OUTLEN];
    
    // utf-8-->gb2312
    CodeConverter cc = CodeConverter("utf-8","gb2312";
    cc.convert(in_utf8,strlen(in_utf,out,OUTLEN);
    cout << "utf-8-->gb2312 in=" << in_utf8 <<",out=" << out << endl;
    
    // gb2312-->utf-8
    CodeConverter cc2 = CodeConverter("gb2312","utf-8";
    cc2.convert(in_gb2312,strlen(in_gb2312),out,OUTLEN);
    cout << "gb2312-->utf-8 in=" << in_gb2312 <<",out=" << out << endl;
    }



    展开全文
  • linux下看一些txt文件经常出现一些乱码问题,所以就自己编写了一个shell脚本来将GB2312码转换成UTF-8码#!/bin/bash#格式:./gb2312_2_utf8.sh 路径名IFSBACKUP=$IFS#备份IFS变量IFS=$(echo -en "\n\b")#设置IFS...

    在linux下看一些txt文件经常出现一些乱码问题,所以就自己编写了一个shell脚本来将GB2312码转换成UTF-8码

    #!/bin/bash

    #格式:./gb2312_2_utf8.sh 路径名

    IFSBACKUP=$IFS#备份IFS变量

    IFS=$(echo -en "\n\b")#设置IFS变量不含空格,防止文件名中有空格时出现异常

    dst=$(echo $1|sed 's/\/$//')#如果路径末尾有“/”,删除掉,后面再添加

    for file in $(ls "$dst"|grep .txt)

    do

    gb2312file=$dst\/$file

    utf8file=$(echo "$gb2312file"|sed 's/.txt$/-utf8.txt/')

    string=$(file "$gb2312file"|grep Unicode)#简单判断文件是否为Unicode文件,如果是,则不转换

    if [ "$string" = "" ]

    then

    iconv -f GB18030 -t utf-8 "$gb2312file" > "$utf8file"#GB18030编码,它是GB2312的一个超集

    else

    echo "$gb2312file" is Unicode text file

    fi

    done

    IFS=$IFSBACKUP

    exit 0

    展开全文
  • unicode转gb18030的c代码

    2020-05-08 16:15:25
    unicode编码转gb18030编码的c代码,纯C语言实现,采用查表方式,不依赖其它外部库,可快速移植到android、linux等系统上。
  • 特搜集了UTF-8,UNICODE,Gb2312他们3个之间的相互转换.UTF-8: 3字节一个字符UNICODE: 2字节一个字符GB2312: 1字节一个字符例子:“你”字的UTF-8编码: E4 BD A0 11100100 10111101 10100000“你”的Unicode编码: 4F ...

    特搜集了UTF-8,UNICODE,Gb2312他们3个之间的相互转换.

    UTF-8:   3字节一个字符

    UNICODE: 2字节一个字符

    GB2312:  1字节一个字符

    例子:

    “你”字的UTF-8编码: E4 BD A0        11100100 10111101 10100000

    “你”的Unicode编码: 4F 60            01001111 01100000

    按照UTF-8的编码规则,分解如下:xxxx0100 xx111101 xx100000

    把除了x之外的数字拼接在一起,就变成“你”的Unicode编码了。

    注意UTF-8的最前面3个1,表示整个UTF-8串是由3个字节构成的。

    经过UTF-8编码之后,再也不会出现敏感字符了,因为最高位始终为1。

    类定义

    class CChineseCode

    {

    public:

    static void UTF_8ToUnicode(wchar_t* pOut,char *pText);  // 把UTF-8转换成Unicode

    static void UnicodeToUTF_8(char* pOut,wchar_t* pText);  //Unicode 转换成UTF-8

    static void UnicodeToGB2312(char* pOut,wchar_t uData);  // 把Unicode 转换成 GB2312

    static void Gb2312ToUnicode(wchar_t* pOut,char *gbBuffer);// GB2312 转换成 Unicode

    static void GB2312ToUTF_8(string& pOut,char *pText, int pLen);//GB2312 转为 UTF-8

    static void UTF_8ToGB2312(string &pOut, char *pText, int pLen);//UTF-8 转为 GB2312

    };

    类实现

    void CChineseCode::UTF_8ToUnicode(wchar_t* pOut,char *pText)

    {

    char* uchar = (char *)pOut;

    uchar[1] = ((pText[0] & 0x0F) << 4) + ((pText[1] >> 2) & 0x0F);

    uchar[0] = ((pText[1] & 0x03) << 6) + (pText[2] & 0x3F);

    return;

    }

    void CChineseCode::UnicodeToUTF_8(char* pOut,wchar_t* pText)

    {

    // 注意 WCHAR高低字的顺序,低字节在前,高字节在后

    char* pchar = (char *)pText;

    pOut[0] = (0xE0 | ((pchar[1] & 0xF0) >> 4));

    pOut[1] = (0x80 | ((pchar[1] & 0x0F) << 2)) + ((pchar[0] & 0xC0) >> 6);

    pOut[2] = (0x80 | (pchar[0] & 0x3F));

    return;

    }

    void CChineseCode::UnicodeToGB2312(char* pOut,wchar_t uData)

    {

    WideCharToMultiByte(CP_ACP,NULL,&uData,1,pOut,sizeof(wchar_t),NULL,NULL);

    return;

    }

    void CChineseCode::Gb2312ToUnicode(wchar_t* pOut,char *gbBuffer)

    {

    ::MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,gbBuffer,2,pOut,1);

    return ;

    }

    void CChineseCode::GB2312ToUTF_8(string& pOut,char *pText, int pLen)

    {

    char buf[4];

    int nLength = pLen* 3;

    char* rst = new char[nLength];

    memset(buf,0,4);

    memset(rst,0,nLength);

    int i = 0;

    int j = 0;

    while(i < pLen)

    {

    //如果是英文直接复制就可以

    if( *(pText + i) >= 0)

    {

    rst[j++] = pText[i++];

    }

    else

    {

    wchar_t pbuffer;

    Gb2312ToUnicode(&pbuffer,pText+i);

    UnicodeToUTF_8(buf,&pbuffer);

    unsigned short int tmp = 0;

    tmp = rst[j] = buf[0];

    tmp = rst[j+1] = buf[1];

    tmp = rst[j+2] = buf[2];

    j += 3;

    i += 2;

    }

    }

    rst[j] = '\0';

    //返回结果

    pOut = rst;

    delete []rst;

    return;

    }

    void CChineseCode::UTF_8ToGB2312(string &pOut, char *pText, int pLen)

    {

    char * newBuf = new char[pLen];

    char Ctemp[4];

    memset(Ctemp,0,4);

    int i =0;

    int j = 0;

    while(i < pLen)

    {

    if(pText[i] > 0)

    {

    newBuf[j++] = pText[i++];

    }

    else

    {

    WCHAR Wtemp;

    UTF_8ToUnicode(&Wtemp,pText + i);

    UnicodeToGB2312(Ctemp,Wtemp);

    newBuf[j] = Ctemp[0];

    newBuf[j + 1] = Ctemp[1];

    i += 3;

    j += 2;

    }

    }

    newBuf[j] = '\0';

    pOut = newBuf;

    delete []newBuf;

    return;

    }

    查看本文来源

    展开全文
  • linux C C++ 字符集转换,UTF-8,GB2312

    千次阅读 2017-11-07 19:12:00
    LINUX上进行编码转换时,既可以利用iconv函数族编程实现,也可以利用iconv命令来实现,只不过后者是针对文件的,即将指定文件从一种编码转换为另一种编码。 一、利用iconv函数族进行编码转换 iconv函数族的头文 在...
  • #include #include #include #include #define ... //gb2312码转为unicode码 rc = g2u(in_gb2312,strlen(in_gb2312),out,OUTLEN); printf("gb2312-->unicode out=%s\n len =%d\n", out, strlen(in_gb2312)); } 
  • 因为项目的需要linux下将GBK编码转换为utf8编码,google一下,网上的相关资源比较少,下面的操作经过本人的反复试验。本例子同样适用于其他的编码转换。有gbk到utf8的转换过程,需要经过unicode作为中间编码。因为...
  • Linux C 字符集转换,UTF-8,GB2312最近帮朋友写个系统接口的小东东,2个系统字符集不同,一个采用UTF-8,一个采用GB2312,不得已需要转换字符集。转换函数记录如下:#include #include #include #include #define ...
  •  注意,不管在Windows or Mac or Linux上,你的pycharm IDE都可以支持各种文件编码,所以即使是utf-8的文件,在windows的pycharm里也可以正常显示 name = "张龙子" name_GBK = name.encode("GBK") print("编码...
  • c语音查表实现unicodegb2312格式互相转换,linux系统可用,包含数据表
  • GB2312: 1字节一个字符 例子: “你”字的UTF-8编码: E4 BD A0 11100100 10111101 10100000 “你”的Unicode编码: 4F 60 01001111 01100000 按照UTF-8的编码规则,分解如下:xxxx0100 x
  • GB2312转UTF-8编码

    2010-01-07 09:52:28
    这是本人在工作中碰到的问题,通过网上搜索资料和自我学习通过自己的代码实现了linux/嵌入式linux中最常见的GB2312转UTF-8的需要,里面有GB2312转UNICODE编码表的源码和UNICODE转UTF-8的转换方法的源码实现及分析...
  • 有些书带的光盘的源...转化的思路很简单,读入流初始化的时候告诉jvm是GB2312编码,读入后jvm内部会UNICODE,写出的时候再告诉jvm以UTF8的形式写出即可.源代码如下:import java.io.*;public class Convert {priv...
  • Linux下如何把读出的unicode成中文保存到文件里啊Linux下如何把读出的unicode成中文保存到文件里啊?我把短信内容读出来看到的全是unicode码,怎么将它们成中文保存到文件里啊?求救!!!------解决方案-...
  • 仅仅针对汉字(每个汉字在UTF-8编码中占3个字节),如果字符串中有英文,就有...再参考一些文章,给出转换方式如下://gb2312 to unicodeint wLen = MultiByteToWideChar(CP_ACP, 0, lpszText, -1, NULL, 0);LPWSTR
  • linux下C语言utf-8编码与gb2312转换代码 2010-04-02 14:09 int code_convert(char *from_charset, char *to_charset, char *inbuf, int inlen, char *outbuf, int outlen) { iconv_t cd...
  • 深入理解-字符编码ASCII,GB2312,GBK,Unicode,UTF-8

    万次阅读 多人点赞 2016-08-06 20:30:32
    GB2321 GBK Unicode UTF-8 一图解忧愁 解决问题 分析 解决方案 题外话-关于parseIntstring radix简介 起初再考虑写不写这篇文章,感觉这篇文章比较枯燥乏味,而且自己感觉也没理解的太透彻,就把理解的记录下来,...
  • “锟斤拷,烫烫烫烫烫~~~~” ASCII、gb2312、gbk、utf-8、Unicode编码详解
  • UTF-8, Unicode, GB2312格式串转换之C语言版  (申明:此文章属于原创,若转载请表明作者和原处链接 )   /* author: wu.jian (吴剑) English name: Sword  /* date: 2007-12-13  /* purpose: 知识共
  • C语言实现GB2312和UTF8之间的编码转换

    千次阅读 2020-11-17 20:05:10
    C语言实现GB2312和UTF8之间的编码转换 GB2312 GB2312编码适用于汉字处理、汉字通信等系统之间的信息交换,基本集共收入汉字6763个和非汉字图形字符682个。GB2312中对所收汉字进行了“分区”处理,字符集分成94个区,...
  •   ... ...   Vim语言设置,烦啊,编码可能一直是操作系统要处理的一个麻烦问题. ...我的Linux上有不少的gb2312 的文件.没法子,只有让Vim也支持他啦。 如果你的系统你自己的主目录中有.vimrc就加入下面...
  • C++11新特性转换GB2312(ANSI)、UTF8、Unicode编码文件 文本的编码方式有很多,参见我另一篇编码简介,文本编码众多,国内用的最多的也就是GB2312或GBK、UTF8(网页居多)、Unicode等。 常用文件编码 目前,大多程序...
  • 这几天工作上碰到了UTF-8转GB2312的问题,而且是在嵌入式的环境,没有API可用,查了很多网上的资料,大多调用VC或者linux下自带的接口。在这里我将这两天的工作做个总结。 总的来说分为两大步(这里就不介绍基础...
  • 一直想把自己的 Linux box 从 zh_CN.GB2312 的 locale 设置迁移到zh_CN.UTF-8 上去,无奈之前的大量的实验中用到的文件都是 GB2312编码的,所以,这个迁移直到最近因为要在一个工具上添加 UTF-8编码的中文支持才得以...
  •  Unicode 的编码和实现 大概来说,Unicode 编码系统可分为编码方式和实现方式两个层次。  编码方式 Unicode 的编码方式与 ISO 10646 的通用字符集(Universal Character Set,UCS)概念相对应,目前实际...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 17,915
精华内容 7,166
关键字:

linux下gb2312转unicode

linux 订阅