C语言宽字符——字符集与字符编码和宽字符之间的关系

前言:

距上一篇博文,已经是3个月的时间了,忙碌着项目开发,无暇顾及博客。现在项目总算是结束了一个段落,是该总结的时候。4月份将会更新几篇文章,都是在项目中遇到的问题,然后再深入了解之后总结出来的,希望通过这个平台能与更多的人有更多的交流。


正文:

我在做日志管理这一部分内容的时候,碰到了这样一个问题:程序运行到时间处理的库函数时,如 ctime, strftime, localtime,程序就会立即断错误,搜索之后才知道这种情况很有可能是因为前面的程序出现了内存泄露或越界,用 valgrind 调试的时候,它总是会在这么一行程序上警告:

wcsncpy(log->name, pu_desc->name, sizeof(log->name)-1);
两个结构体成员的 name 均定义成 wchar_t name[32],所以使用了 wcsncpy。开始的时候怎么都没看出来哪里出问题了,我还特意在复制的大小值那里减1,就是为了预防越界。后来用 gdb 跟踪到这里,gdb 显示第三个参数传递的是 127,的确是没错,因为在 GNU 的 C 库里面,wchar_t 是4个字节的,又回头查阅了 wcsncpy 的帮助手册,才看到这个函数要求传递的第三个参数是 宽字符的个数,而不是字节数。传递了 127 个宽字符,肯定就越界了。

除了这个问题以外,在数据库处理的时候也碰到了字符乱码的问题,因为这个名称是要求用中文显示的,后来虽然问题解决了,但是一直搞不清楚UTF-8,宽字符之间到底是一种怎么样的关系,更别说再扯到其他的 UTF-16 等等,就彻底糊涂了。经过这几天的深入了解,总算是有些头绪了,现在以问题列表的形式将学习内容总结如下:


一、什么是ISO 10646,Unicode,UCS,UTF-8,UTF-16,UTF-32,UCS-2,UCS-4?它们到底存在什么样的关系?


1. 字符集和字符编码

要弄清这些,先要明白两个概念:字符集(character set)和字符编码(character encoding)。ISO 10646是 标准 ,UCS 和 Unicode 是 字符集 ,剩下的都是 字符编码 字符集</
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值