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

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

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日

悬赏问题

  • ¥20 玩游戏gpu和cpu利用率特别低,玩游戏卡顿
  • ¥25 oracle中的正则匹配
  • ¥15 关于#vscode#的问题:把软件卸载不会再出现蓝屏
  • ¥15 vimplus出现的错误
  • ¥15 usb无线网卡转typec口
  • ¥30 怎么使用AVL fire ESE软件自带的优化模式来优化设计Soot和NOx?
  • ¥15 Ubuntu20.04.4.LTS系统如何下载安装VirtualBox虚拟机?
  • ¥15 如何用QDomDocument读取内容为空格的xml数据
  • ¥15 请阅读下面代码,帮我修改下代码
  • ¥15 关于#microsoft#的问题:电脑启动后不显示桌面图标和窗口,除任务栏外无法操作任何东西