为了支持多语言,需要支持宽字符,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");

然后进行转换

/*** 用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;
}

测试程序:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include <wchar.h>
#include <locale.h>
#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;
}

输出结果:

[root@23 test]# ./test_hanzi
len:3
wlen:3
len:4
wbuf sieof:400 // sizeof (宽字符) = 所占字节的总长度 = 宽字符长度 * 4
wbuf array sizeof:100

Linux下 wchar_t 与char 转换相关推荐

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

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

  2. C++ WINDOWS下 wchar_t *和char * 相互转化总结篇

    说道wchar_t和char两个类型大家都不会陌生 wchar_t:在windows下是Unicode 16编码,也就是俗称宽字节 char:当然就是指一个字节,在windows下面默认是gbk编码的 ...

  3. c语言 wchar t转char,C++ WINDOWS下 wchar_t *和char * 相互转化总结篇

    说道wchar_t和char两个类型大家都不会陌生 wchar_t:在windows下是Unicode 16编码,也就是俗称宽字节 char:当然就是指一个字节,在windows下面默认是gbk编码的 ...

  4. Linux下PDF操作与转换

    Linux下PDF操作与转换 2013-07-02 09:44:58 分类: LINUX 如果说PDF是电子纸张,那么pdftk就是电子起钉器.打孔机.粘合剂.解密指环和 X光镜片.Pdftk是一个简 ...

  5. 简单的wchar_t 和 char 转换类, 且包含与UTF8的转换

    /***************************************************************简单的wchar_t 和 char 转换类,且包含与UTF8的转换(需要 ...

  6. linux旋转图片,Linux下图像压缩、格式转换、缩放、旋转

    Linux下图像压缩.格式转换.缩放.旋转 1.jpegoptim:epel源 1.1.安装 # ubuntu: apt-get install jpegoptim -y # CentOS: yum ...

  7. linux用avk怎么提取字符,在Linux下进行视频音频格式转换提取等

    Linux系统下视频转换:Mencoder和Ffmpeg ◆Linux下的视频转换:mencoder 制作适合在智能手机和PDA上观看的mpeg4视频. Linux上有一个很强大的视频音频转换软件,就 ...

  8. wchar_t与char转换(转载)

    原文地址:http://hi.baidu.com/gchrist/blog/item/29a138f533383e24bd310934.html 环境:Dev cpp 平台i386 C++标准中,wc ...

  9. Unicode字符集下CString与char *转换 (解决中文乱码等)(转)

    UniCode 下 CString 转 char* 的方法的文章有很多,但是大部分都是在互相转载,看了那么多资料,仍然没有解决乱码的问题,后来从一个论坛的一条回复里面找到了正确的方法,特此拿出来与大家 ...

最新文章

  1. smslib java_java利用SMSLib通过COM发送短信JAR包
  2. 数学建模学习笔记——多元回归
  3. 用map实现数据字典功能
  4. 第六章实验报告(函数和宏定义实验)
  5. linux 编译链接出错,Qt编译和链接错误
  6. 数据库 -- 单表的数据查询
  7. ectouch java_ectouch: 包含 ECTouch_v2.7.2_SC_UTF8 ECshop_v3.6.0_UTF8_release ECShop_V4.0.0_UTF8
  8. nagios 飞信通知
  9. Map获取key值和value值
  10. Computer vision: models, learning and inference 学习笔记1:引言
  11. STM32CubeMX的使用教程
  12. linux内核编译时bad register name `%dil'错误
  13. ubuntu系统下破解Clion
  14. iOS硬编解码相关知识
  15. PCB入门使用技巧——个人笔记
  16. 【评弹】夺印-夜访 歌词 盛小云
  17. ASP.NET MVC3 快速入门
  18. 解决Python打开文件报错UnicodeDecodeError: 'gbk' codec can't decode byte
  19. 海贝音频384khz_海贝音乐usb输出怎么设置_海贝音乐设置usb输出教程【图】
  20. flex布局 \ 圣杯布局

热门文章

  1. idea恢复被覆盖的本地未提交代码
  2. 2022第四届长安杯复盘
  3. npm--踩坑--npm audit fix 解决方法
  4. python100个常用术语_Python 常用术语
  5. partition by用法
  6. MYSQL 唯一约束
  7. 4.16 日期的输入和自定义日期的格式 [原创Excel教程]
  8. 移位运算(左移和右移)
  9. System.UnauthorizedAccessException: Access to the path 'D:/web/WebMicaps/TempImages/msc_cntr_0.txt'
  10. Unity 修改场景中人型骨骼模型的骨骼旋转角度