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

2023-05-16

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • Linux无法删除文件

    当我找到文件时 我在删除它们时遇到问题 任务 必须找到带有空格的文件并将其删除 我的尝试 rm find L root grep i 但我有错误 rm cannot remove root test No such file or dire
  • 如何在 Linux 上通过 FTP 递归下载文件夹 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案
  • Tomcat Intellij Idea:远程部署

    RackSpace 云服务器 Ubuntu 12 04 Intellij Idea 11 1 2 Windows 8 Tomcat 7 0 26 JDK 6 在 Intellij Idea 上 当我尝试在远程 Tomcat 7 服务器上运行
  • vmsplice() 和 TCP

    在原来的vmsplice 执行 有人建议 http lwn net Articles 181169 如果您的用户态缓冲区是管道中可容纳的最大页面数的 2 倍 则缓冲区后半部分成功的 vmsplice 将保证内核使用缓冲区的前半部分完成 但事
  • 仅使用containerd(不使用Docker)修剪容器镜像

    如果我刚刚containerd安装在 Linux 系统上 即 Docker 是not安装 如何删除未使用的容器映像以节省磁盘空间 Docker 就是这么方便docker system prune https docs docker com
  • Linux 中 m 标志和 o 标志将存储在哪里

    我想知道最近收到的路由器通告的 m 标志和 o 标志的值 从内核源代码中我知道存储了 m 标志和 o 标志 Remember the managed otherconf flags from most recently received R
  • Google BQ:运行参数化查询,其中参数变量是 BQ 表目标

    我正在尝试从 Linux 命令行为 BQ 表目标运行 SQL 此 SQL 脚本将用于多个日期 客户端和 BQ 表目标 因此这需要在我的 BQ API 命令行调用中使用参数 标志 parameter 现在 我已经点击此链接来了解参数化查询 h
  • 仅将 char[] 的一部分复制到 String 中

    我有一个数组 char ch 我的问题如下 如何将 ch 2 到 ch 7 的值合并到字符串中 我想在不循环 char 数组的情况下实现这一点 有什么建议么 感谢您花时间回答我的问题 Use new String value offset
  • 执行“minikube start”命令时出现问题

    malik malik minikube start minikube v1 12 0 on Ubuntu 18 04 Using the docker driver based on existing profile Starting c
  • GMail 421 4.7.0 稍后重试,关闭连接

    我试图找出为什么它无法使用 GMail 从我的服务器发送邮件 为此 我使用 SwiftMailer 但我可以将问题包含在以下独立代码中
  • 使用非规范地址检索内存数据会导致 SIGSEGV 而不是 SIGBUS

    我无法使用以下汇编代码产生 总线错误 这里我使用的内存地址不是合法的 规范地址 那么 我怎样才能触发该错误呢 我在带有 NASM 2 14 02 的 Ubuntu 20 04 LTS 下运行这段代码 但它会导致负载出现 SIGSEGV 分段
  • 如何获取 (Linux) 机器的 IP 地址?

    这个问题和之前问的几乎一样如何获取本地计算机的IP地址 https stackoverflow com questions 122208 get the ip address of local computer 问题 但是我需要找到一个的I
  • 在 vc++ 中将 'System::String ^' 转换为 'const char *'

    如何在 vc 中将 System String 转换为 const char My code String Result1 C Users Dev Desktop imag jpg IplImage img1 cvLoadImage Res
  • CMake 链接 glfw3 lib 错误

    我正在使用 CLion 并且正在使用 glfw3 库编写一个程序 http www glfw org docs latest http www glfw org docs latest 我安装并正确执行了库中的所有操作 我有 a 和 h 文
  • 使用 MAX_ORDER / 包含 mmzone.h

    根据https www kernel org doc Documentation networking packet mmap txt https www kernel org doc Documentation networking pa
  • C++ 将字符与字符串文字进行比较[重复]

    这个问题在这里已经有答案了 初学者程序员在这里 我正在为计算机科学课编写一个非常简单的程序 并且遇到了一个我想了解更多的问题 这是我的代码 include
  • 从 Xlib 转换为 xcb

    我目前正在将我的一个应用程序从 Xlib 移植到 libxcb 但在查找有关我有时使用的 XInput2 扩展的信息时遇到了一些麻烦 libxcb 中有 XInput2 实现吗 如果是的话 在哪里可以找到文档 目前我在使用此功能时遇到问题
  • 静态方法的 Java 内存模型

    我来自操作系统和 C 语言背景 在代码编译时 世界很简单 需要处理和理解堆栈 堆文本部分等 当我开始学习 Java 时 我确实了解 JVM 和垃圾收集器 我对静态方法感到很有趣 根据我的理解 类的所有实例都会在堆中创建 然后被清理 但是 对
  • Mac OS X 上的 /proc/self/cmdline / GetCommandLine 等效项是什么?

    如何在不使用 argc argv 的情况下访问 Mac OS X 上的命令行 在 Linux 上 我会简单地阅读 proc self cmdline or use GetCommandLine在 Windows 上 但我找不到 Mac OS
  • 为什么opencv videowriter这么慢?

    你好 stackoverflow 社区 我有一个棘手的问题 我需要你的帮助来了解这里发生了什么 我的程序从视频采集卡 Blackmagic 捕获帧 到目前为止 它工作得很好 同时我用 opencv cv imshow 显示捕获的图像 它也工

随机推荐