因为项目的需要linux下将GBK编码转换为utf8编码,google一下,网上的相关资源比较少,下面的操作经过本人的反复试验。本例子同样适用于其他的编码转换。

有gbk到utf8的转换过程,需要经过unicode作为中间编码。因为Windows的转换相对简单,先讲一下windows下的转换过程,linux下的过程基本相同,函数使用上有差别。

Windows下:

1、在windows下可以使用函数MultiByteToWideChar先将多字节字符,转换为unicode。

2、使用函数WideCharToMultiByte,将unicode再转换为utf8编码。

google一下,网上例子很多。在这里贴了一个简单的源码,实现ansi到utf8编码的转换

view plain

char *multichar_2_utf8(const char *m_string)

{

int len=0;

wchar_t *w_string;

char *utf8_string;

//计算由ansi转换为unicode后,unicode编码的长度

len=MultiByteToWideChar(CP_ACP,0,(LPCTSTR)m_string, -1, NULL,0);//CP_ACP指示了转换为unicode编码的编码类型

w_string=(wchar_t *)malloc(2*len+2);

memset(w_string,0,2*len+2);

//ansi到unicode转换

MultiByteToWideChar(CP_ACP, 0, (LPCTSTR)m_string,-1,w_string, len);//CP_ACP指示了转换为unicode编码的编码类型

//计算unicode转换为utf8后,utf8编码的长度

len = WideCharToMultiByte(CP_UTF8, 0, w_string, -1, NULL, 0, NULL, NULL);//CP_UTF8指示了unicode转换为的类型

utf8_string=(char *)malloc(len+1);

memset(utf8_string, 0, len + 1);

//unicode到utf8转换

WideCharToMultiByte (CP_UTF8, 0, w_string, -1, utf8_string, len, NULL,NULL);//CP_UTF8指示了unicode转换为的类型

free(w_string);

return utf8_string;

}

Linux下:

linux下没有上面的两个函数,需要使用函数 mbstowcs和wcstombs

mbstowcs将多字节编码转换为宽字节编码

wcstombs将宽字节编码转换为多字节编码

这两个函数,转换过程中受到系统编码类型的影响,需要通过设置来设定转换前和转换后的编码类型。通过函数setlocale进行系统编码的设置。

linux下输入命名

locale -a查看系统支持的编码类型。

view plain

andy@andy-linux:~$ locale -a

C

en_AG

en_AU.utf8

en_BW.utf8

en_CA.utf8

en_DK.utf8

en_GB.utf8

en_HK.utf8

en_IE.utf8

en_IN

en_NG

en_NZ.utf8

en_PH.utf8

en_SG.utf8

en_US.utf8

en_ZA.utf8

en_ZW.utf8

POSIX

zh_CN.gb18030

zh_CN.gbk

zh_CN.utf8

zh_HK.utf8

zh_SG.utf8

zh_TW.utf8

本例子中实现的是由zh_CN.gbk到zh_CN.utf8的转换

流程:

1、调用函数setlocale(LC_ALL,"zh_CN.gbk"),设置待转码的字符串类型为gbk类型。

2、调用函数mbstowcs,实现 1 设置的编码到unicode编码的转换。

3、调用函数setlocale(LC_ALL,"zh_CN.utf8"),设置转换后编码类型为utf8类型。

4、调用函数wcstombs,实现unicode到 3 设置的编码类型的转换。

下面是我写的源码

view plain

#include

#include

/******************************************************************************

* FUNCTION: gbk2utf8

* DESCRIPTION: 实现由gbk编码到utf8编码的转换

*

* Input: utfStr,转换后的字符串; srcStr,待转换的字符串; maxUtfStrlen, utfStr的最

大长度

* Output: utfStr

* Returns: -1,fail;>0,success

*

* modification history

* --------------------

* 2011-nov-25, lvhongya written

* --------------------

******************************************************************************/

int gbk2utf8(char *utfStr,const char *srcStr,int maxUtfStrlen)

{

if(NULL==srcStr)

{

printf("Bad Parameter\n");

return -1;

}

//首先先将gbk编码转换为unicode编码

if(NULL==setlocale(LC_ALL,"zh_CN.gbk"))//设置转换为unicode前的码,当前为gbk编码

{

printf("Bad Parameter\n");

return -1;

}

int unicodeLen=mbstowcs(NULL,srcStr,0);//计算转换后的长度

if(unicodeLen<=0)

{

printf("Can not Transfer!!!\n");

return -1;

}

wchar_t *unicodeStr=(wchar_t *)calloc(sizeof(wchar_t),unicodeLen+1);

mbstowcs(unicodeStr,srcStr,strlen(srcStr));//将gbk转换为unicode

//将unicode编码转换为utf8编码

if(NULL==setlocale(LC_ALL,"zh_CN.utf8"))//设置unicode转换后的码,当前为utf8

{

printf("Bad Parameter\n");

return -1;

}

int utfLen=wcstombs(NULL,unicodeStr,0);//计算转换后的长度

if(utfLen<=0)

{

printf("Can not Transfer!!!\n");

return -1;

}

else if(utfLen>=maxUtfStrlen)//判断空间是否足够

{

printf("Dst Str memory not enough\n");

return -1;

}

wcstombs(utfStr,unicodeStr,utfLen);

utfStr[utfLen]=0;//添加结束符

free(unicodeStr);

return utfLen;

}

linux windows 字符编码转换,Linux操作系统下汉字编码的转换相关推荐

  1. 操作系统原理,系统调用,系统调用与库函数API等函数之间的调用关系,功能与机制设计,系统调用的执行过程与Linux系统调用执行示例,不同操作系统下的PCB

    操作系统原理,系统调用,功能与机制设计,系统调用的执行过程与Linux系统调用执行示例,不同操作系统下的PCB 一.系统调用:操作系统功能调用,用户在编程时可以调用的操作系统功能. 1.系统调用是操作 ...

  2. java linux urlencode_java字符编码转换研究(转)

    1. 概述 本文主要包括以下几个方面:编码基本知识,java,系统软件,url,工具软件等. 在下面的描述中,将以"中文"两个字为例,经查表可以知道其GB2312编码是" ...

  3. linux windows文件 编码_一站式解读彻底搞懂Python编码

    " Python的编码问题,有一个完整的体系.如果不从整体上进行讨论,总是云里雾里的." 从敲代码到屏幕看到字符,涉及好几个关键的环节.每一个环节对于字符的正常输出都有很大的影响. ...

  4. linux windows文件 编码_解决Linux与Windows文件显示乱码的问题

    重点:如果windows 下和虚拟机共享文件,先将文件移到其他位置使用notepad++ 改变编码模式为UTF-8,然后复制到共享目录,然后用编辑器打开中文就不是乱码了. 问题: 在Windows下用 ...

  5. windows命令行下访问linux,Windows支持直接访问Linux子系统文件:你的下一台Linux何必是Linux...

    原标题:Windows支持直接访问Linux子系统文件:你的下一台Linux何必是Linux 晓查 发自 凹非寺 量子位 报道 | 公众号 QbitAI 微软,致力于做最好的Linux发行版. 今天, ...

  6. linux windows文件 编码_Mac, Windows和Linux电脑之间如何快速传输文件

    Mac, Windows和Linux电脑之间如何快速传输文件 本文介绍的方法主要适用于在家庭环境中的多台电脑之间快速传输文件,比如家中有三台电脑分别是Windows, Mac和Linux系统,如果传输 ...

  7. Windows字符编码那些事儿

    1. visual studio项目中的Character Set设置 vs里的cs设置有三种,NS,Unicode,MBCS,后两种皆是显示设置编译条件,即是向Command Line中添加UNIC ...

  8. windows 字符编码总结

    Unicode的出现是为了适应软件国际化的需要.Unicode不同于双字节字符集(DBCS). 一.相关操作函数 1.DBCS使用下面的函数操作字符串: CharNext--获得后一个字符 CharP ...

  9. 延时关机命令 linux,windows定时关机和linux定时关机的方法(shutdown命令)

    windows版:由于各种原因我们可能需要定时关机的功能.在windows下常用的做法可能是使用一些工具或常用软件(例如酷我音乐盒)实现.但如果你没有该功能的软件又不想为了实现这个功能去增添软件,你可 ...

最新文章

  1. jqueryui autocomplete 控件自定义source检索
  2. linux C 内存管理方式之半动态
  3. linux c 错误 'for' loop initial declaration used outside C99 mode
  4. 正则表达式匹配换行符
  5. c 整数的逆序输出 输入3,2就算 2+22+222的结果
  6. QT学习笔记(十三):绘制图像
  7. https无法访问 宝塔_解决宝塔面板开启自带免费Let's Encrypt SSL证书后网站无法访问...
  8. directx修复工具_Diamond Cut Forensics 10(音频修复软件)分享
  9. ssrf dict MySQL_SSRF之利用dict和gopher吊打Redis
  10. 合天网安实验室-sql注入实验一
  11. 质心公式_No.217 质心位置的求法(基础篇)
  12. gluster容量显示处理
  13. Ubuntu16.06 单Nvidia显卡 深度学习运行时 界面卡顿(刷新慢)的解决方法
  14. 一个有用的命令jcmd
  15. 买菜App综合服务水平排行:盒马、多点、每日优鲜排前三
  16. 远程访问MySql数据库
  17. sql modify的使用方法
  18. Photoshop 速写效果
  19. 浅谈游戏《Dead Cells死亡细胞》
  20. 电商B2C商铺新用户复购预测(一)

热门文章

  1. JetBrains 第二轮:再为免费全家桶续命三个月
  2. Spring Boot 2.x基础教程:使用Spring Data JPA访问MySQL
  3. ajax返回头部页面,ajax getResponseHeader获取中文响应头
  4. docs邮箱服务器,邮件服务器更换域名
  5. c语言中malloc分配矩阵,malloc,分配矩阵
  6. 函数重写 java_java 函数的重载和重写实例代码
  7. linux sheet脚本去掉m,linux下的文本dos格式转unix格式,去除^M符号
  8. 目标检测 yolov1
  9. RuntimeError Assertion cur_target = 0 cur_target n_classes failed
  10. sws_scale sws_getContext