m0_59696510 2021-07-07 23:48 采纳率: 75%
浏览 196
已采纳

用字符数组储存汉字,但输出错误,是什么原因

img

  • 写回答

2条回答 默认 最新

  • include_iostream_ 2021-07-08 13:56
    关注

    首先,输出非英文字符集存在字符集问题,英语则因为属于ASCII字符集,而多数字符集都兼容ASCII字符集,而不存在乱码问题。C中要考虑三个字符集:源字符集,编译器内部字符集(这个其实很少要考虑),执行字符集(这个才是重点),如果源字符集到执行字符集中间有一步不对,就会出问题。操作系统的环境一般提供了各个locale的预设字符集,如果可执行程序最终的执行字符集和环境提供的字符集不匹配,也很可能出现乱码。至于如何修正乱码,这个很复杂,Linux下常用一个叫做iconv的库,而Windows下一般用宽字符/多字节字符互转的一个系统的字符串API。要使用它们,需要先了解什么是宽字符,什么是多字节字符,鉴于网络上有很多答案是错误的,我们这里简单解释一下:宽字符是指万国码Unicode,多字节是指ANSI这样的比较混乱的字符集,这样的字符集往往一个字符集只表示一种或少数几种语言,比较麻烦。由于历史原因,很多软件还在使用并不通用的ANSI字符集。(注:ANSI字符集并不是一个字符集,而是指ANSI标准下各组织自己规定的字符集。由于ANSI没有规定ANSI字符集的细节,这些字符集彼此之间兼容性很低。)如果不需要运行时转码,可以通过编译器的charset有关选项和有关的pragma宏指定执行字符集。不同编译器做法差别很大,我不知道你的编译器是什么,所以无法准确回答。
    第二个问题,你这个程序逻辑上有问题,显然你不太熟悉涉及非英语语言字符的C/C++语法。char一个只能存256种不同的值,而汉字显然有远远不止256个,试图用char存储单个汉字显然是错误的(但char数组确实可以存储汉字字符串)。C语言中,我们说单引号括起来的是单个字符,这造成了一种误解:很多人认为单引号里必须只能有一个字符(换种说法就是一个字节)。事实则是,C的单引号里可以有多个字节,例如'abc'也是合法的多字节常量,C标准容忍了这种常量,却没有说它的作用,换言之其行为是编译器自己决定的,没有标准可言。你写的'天'这种常量就是典型的多字节常量,编译器无论将它处理成什么都是正确的,但就是不可能是“天”字本身,因为一个字节不足以存下这个汉字。从C++11起(我记得是哈,也可能是C++17),你可以写char a[] = u8"好好学习,天天向上",表示指定用UTF-8编码存储这个字符串常量。如果你的执行字符集和环境字符集都是UTF-8,这个字符串就可以正确输出了。
    对于你给出的这段代码,我还无法回答,需要知道你的编译器和运行环境才能给出具体修改方案,但也只是大方向;字符集转换是件挺麻烦的事。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 已采纳回答 7月13日

悬赏问题

  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改
  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持