为了支持多语言,需要支持宽字符,Linux下用wchar_t表示,wchar_t最大长度4个字节,已经可以囊括世界上所有的语言编码,中文字符在gb2312编码下用2个字节表示,但用utf-8编码需要3个字节表示。

Linux下的系统调用,大部分都已经有对应的宽字符版本。具体可参照对照表

但仍有一些系统调用是没有宽字符版本的,例如fopen系列函数:

FILE *fopen(const char *path, const char *mode);

首先要设置本地区域

setlocale(LC_CTYPE, "zh_CN.utf8");

1

然后进行转换

/**

* 用malloc申请了空间,需要在外面释放

*/

int to_wchar(wchar_t **ppDest, const char *pSrc)

{

int len = 0;

int ret = 0;

len = strlen(pSrc) + 1;

if (len <= 1) return 0;

*ppDest = malloc (len);

/*这里的len应该为宽字符长度,而非源字符串的字节长度,但字节长度肯定大于宽字符长度,因此暂且用之*/

ret = mbstowcs(*ppDest, pSrc, len);

return ret;

}

/**

* 用malloc申请了空间,需要在外面释放

*/

int wtochar(char **ppDest, const wchar_t *pSrc)

{

int len = 0;

int ret = 0;

len = wcslen(pSrc) + 1;

if (len <= 1) return 0;

/*sizeof(wchar_t) = 4 */

*ppDest = malloc (len * sizeof(wchar_t));

/*这里的第三个长度参数,应为字节长度,即宽字符长度 * 4 */

ret = wcstombs(*ppDest, pSrc, len * sizeof(wchar_t));

return ret;

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

测试程序:

#include

#include

#include

#include

#include

#define array_size(ar) (sizeof(ar) / sizeof(ar[0]))

wchar_t *to_wchar(wchar_t **ppDest, const char *pSrc)

{

int len = 0;

int ret = 0;

len = strlen(pSrc) + 1;

if (len <= 1) return *ppDest;

*ppDest = (wchar_t*)malloc (len*sizeof(wchar_t));

/*如果第一个参数为NULL,则可以用来返回宽字符的长度*/

printf ("len:%ld\n", mbstowcs(NULL,pSrc,0)+1);

ret = mbstowcs(*ppDest, pSrc, len);

return *ppDest;

}

int main()

{

char *a = "一";

wchar_t *b = L"1s一";

wchar_t *c = L"1s一";

wchar_t *pbuf;

wchar_t wbuf[100];

setlocale(LC_CTYPE, "zh_CN.utf8");

printf ("len:%ld\n", strlen(a));

printf ("wlen:%ld\n", wcslen(b));

to_wchar(&pbuf, "1s壹");

free(pbuf);

printf ("wbuf sieof:%ld\n", sizeof(wbuf));

printf ("wbuf array sizeof:%ld\n", array_size(wbuf));

return 0;

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

输出结果:

[root@23 test]# ./test_hanzi

len:3

wlen:3

len:4

wbuf sieof:400 // sizeof (宽字符) = 所占字节的总长度 = 宽字符长度 * 4

wbuf array sizeof:100

---------------------

作者:wwlhz

来源:CSDN

原文:https://blog.csdn.net/wwlhz/article/details/74775053

版权声明:本文为博主原创文章,转载请附上博文链接!

linux下中文的wchar转char,Linux下 wchar_t 与char 转换相关推荐

  1. linux下中文的wchar转char,Linux 下char转换为wchar_t

    LInux下使用mbstowcs函数可以将char转化为wchar_t 函数含义:convert a multibyte string to a wide char string 说明:        ...

  2. linux qq 中文输入法下载,百度输入法Linux版

    百度输入法Linux版 百度输入法Linux版软件简介:百度输入法Linux版适用拼音字母.五笔二种中文输入方法,拼音输入适用全拼音.简影,也支持英文键入方式,还有着智能化改错.云键入.全句想到等特点 ...

  3. linux程序设计中文第4百度云,Linux程序设计中文第4版-有书签.pdf

    言函数库和由不同的Linux或UNIX标准指定的各种工具的使用方法,大多数标准Linux开发工具的使用方法,通过DBM和MySQL数据库系统存储Linux中的数据,为x视窗系统建立图形化用户界面等.& ...

  4. linux qt中文输入法,解决 Ubuntu 14.04 下 Qt5 中文显示和中文输入法问题

    1qt5安装 软件中心中安装 qt creater,此时Qt无法显示中文 且无法输入中文 如果要设置中文等语言,还要下载一些语言文件.可以到http://qt-project.org上下载一个包,安装 ...

  5. linux ls 中文乱码_每天一个linux命令:Linux文件类型与扩展名

    Linux文件类型和Linux文件的文件名所代表的意义是两个不同的概念.我们通过一般应用程序而创建的比如file.txt.file.tar.gz ,这些文件虽然要用不同的程序来打开,但放在Linux文 ...

  6. linux安装 中文乱码怎么解决方法,Linux安装GBK/GB2312程序显示乱码的五种解决方法...

    不少用户在Linux系统中安装GBK或GB2312的时候遇到了乱码问题,这主要是系统默认语言是uft8所导致,对于该问题可用五种方法进行解决,接下来是小编为大家收集的Linux安装GBK/GB2312 ...

  7. Linux 安装中文 man 手册

    Linux 安装中文 man 手册 Linux 安装中文 man 手册章节介绍 centos 安装中文 man 手册1 centos 安装中文 man 手册2 Ubuntu安装 源码安装 环境变量配置 ...

  8. linux redhat中文字体安装,中文Linuxredhat中文字体安装

    Linux redhat中文字体安装 安装完linux redhat 5.4打开浏览器发现显示中文全部成了乱码原来在安装的时候没有选择安装中文字体支持包打开系统的镜像找到中文字体的相关安装包如 ...

  9. linux redhat中文字体安装,Linux redhat中文字体安装.doc

    Linux redhat中文字体安装 Linux redhat中文字体安装 安装完linux redhat 5.4,打开浏览器发现显示中文全部成了乱码,原来在安装的时候没有选择安装中文字体支持包,打开 ...

最新文章

  1. cartograhper--X1_lidar
  2. PHP源码迁移到GitHub
  3. 5-35 城市间紧急救援 (25分) pat 数据结构
  4. mysql整点抖动_MySQL 5.5 大量数据插入出现的抖动问题 及 解决方法
  5. android nv21 nv12,android - 将NV21转换为NV12并旋转90度通过libyuv? - 堆栈内存溢出
  6. java 制作简历_个人简历java制作.doc
  7. html中的文字透明背景图片,利用css实现背景透明和文字不透明效果汇总
  8. android time计时器,android 计时器的三种实现(Chronometer、Timer、handler)
  9. macos安装盘第三方工具制作_制作 macOS Mojave U盘USB启动安装盘方法教程 (全新安装 Mac 系统)...
  10. 展望:2021年程序员业界趋势与生存指南
  11. Armbian 配置 WiFi
  12. 一种鼠标手势识别的方案
  13. python 多版本共存
  14. Python书籍阅读与记录 6.17 I 文件和异常
  15. JavaScript 的addEventListener() 事件监听详解!
  16. 发票、司法、扶贫,政务应用已成区块链率先落地领域?
  17. 健康保健--维多利亚宣言
  18. 李晓洋出任百度资本CEO 负责投融资及全面管理工作
  19. 网站 服务器 ftp地址,ftp服务器地址 登录ftp服务器的方式
  20. ERP认证是什么 ?

热门文章

  1. HoloLens 开发笔记
  2. 2023最新版本RabbitMQ下载安装教程
  3. 使用antv/X6实现流程图(包括线条动画流动,路径标签,悬浮窗口等)快速搭建流程图,DAG图等初始实践记录
  4. JAVA与GO语言哪个更容易学?
  5. Parker驱动器维修COMPAX控制器维修CPX0200H
  6. 什么项目适合采用网络监控系统
  7. JAVA对比崔克,【内含投票】棋逢对手!闪电Tarmac SL6 Comp与崔克Émonda SL6详细测评,你喜欢哪款?...
  8. 模拟山羊3 Goat Simulator3v1.0.1.3官方中文免安装【3.3G】
  9. 小米手机能刷鸿蒙系统了!这操作太6了!
  10. mysql插入\更新前+判断条件