C++中char,char*,char[],string存储中文的问题

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

学习时遇到的问题,如有不对,欢迎大佬们批评指正!

一、使用char,char*,char[],string存储中文

char 类型是有符号的,其范围是-128到127。当一个超出 char类型表示范围的值被赋值给一个 char 类型变量时,会发生截断。截断的过程实际上是将原始值的高位部分丢弃,只保留低位部分。
查看得vs编译器默认采用unicode字符集(Unicode 只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储),GB2312编码。
(关于上面一句话我的理解是中文字符按照unicode进行翻译对应码值,存储到内存时候按照GB2312方式存储。这一点不是很确定?求指导),GB2312编码时1个中文占两个字节,char只有一个字节,存储失败,会发生截断。
eg:char a= ‘好’;
‘好’ 对应unicode码值为0x597D, 内存存储按照小端序存储:0x7D 59 ,char a占一个字节,读取内存是从&a开始往后读1个字节,所以此时a在内存中的地址为0x 7D,换为2进制:1111101,因为char是有符号类型,最高位1为符号位,表示负数,真值为111101=61(10进制),所以此时截取后的码值为-61。
在这里插入图片描述

![a内存地址的值](https://img-blog.csdnimg.cn/direct/c93588a4c89c4836aaf3ed37f7b1ef84.png

’这也说明了所有中文如果存储在char,char*,char[],string类型中,后三种类型虽然不会像char截断,但是也是分两个字节进行存储中文,中文分开两个字节存储时候编译器的unicode字符集就无法识别,又因为每个字节十六进制转为2进制的第一位一定是1,所以显示在内存中的每个元素的码值为负数。
在这里插入图片描述

二、内存中是乱码,但是可以正常输出

在这里插入图片描述
此时cout可以显示str为你好,猜测原因是输出时,因为内存空间是连续的,按照vs字符集unicode翻译还是可以翻译出来的。

三、解决方法:w_char,

为此设计wchat_t字符,即宽字符,每个字符都是按照两个字节来编码。为了和传统的char字符区分,wchar_t字符(串)在申明的时候,需要加上大写字母“L”。既然有wchar_t,标准库自然有其对应的字符串:wstring。
相对应的用标准输入输出流打印宽字节字符(串),需要用std::wcout;
在这里插入图片描述
但此时发现wcout是只能输出纯英文字符串,含中文的字符串输出为空。可以在前面加一行代码:
setlocale(LC_ALL, “chs”);
设置程序的本地化信息,将程序的区域设置为简体中文(“chs” 表示简体中文)。此时就可以正常输出中文。(但C++中直接使用setlocale似乎不太规范,后续在研究)

  • 41
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
ROS是机器人操作系统,用于开发机器人软件的一种框架。在ROS,参数传递是非常常见的一个问题,因为在机器人系统需要不同的节点和模块之间相互协作。而为了让这些节点能够相互协作,就需要在这些节点之间传递参数信息。而在ROS传递参数信息的方式就是使用命令行参数。 在ROS,使用命令行参数的方式和在C/C++使用命令行参数的方式是一样的。在C/C++,使用命令行参数可以通过argv和argc来实现。其argv是一个指向字符串数组的指针,它存储了从命令行传递过来的参数信息,而argc是参数的个数。而在ROS,使用命令行参数也是通过argv和argc来实现的。 在ROS,通过定义char** string类型的argv参数来获取从命令行传递过来的参数信息。其char**是指向指针的指针,它可以存储字符串类型的信息。而在ROS,命令行传递过来的参数信息都是字符串类型的信息。因此在ROS,使用char** string类型的argv参数可以获取从命令行传递过来的所有的参数信息。 总而言之,ROS提供了很多非常方便的工具和API来处理不同节点之间的参数传递。而在ROS,通过命令行参数argv和argc来实现参数传递也是非常方便的一种方式。在ROS使用char** string类型的argv参数可以方便地获取从命令行传递过来的参数信息,提高了程序的灵活性和可维护性。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值