首页 > 编程语言 >C++中char,char*,char[],string存储中文的问题

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

时间:2024-03-22 19:03:43浏览次数:36  
标签:存储 string 中文 C++ char 内存 unicode 字节

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

文章目录


前言

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

一、使用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内存地址的值](/i/ll/?i=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似乎不太规范,后续在研究)

标签:存储,string,中文,C++,char,内存,unicode,字节
From: https://blog.csdn.net/m0_54984588/article/details/136768924

相关文章

  • [C++提高编程](一):模板----函数模板
    目录函数模板作用函数模板的语法注意事项普通函数与函数模板的区别普通函数与函数模板的调用规则模板的局限性案例--通用数组选择排序从大到小模板是C++中泛型编程的基础,一个模板就是一个创建类或函数的蓝图或者公式。函数模板作用建立一个通用函数,其函数返回值类型......
  • C++看程序写结果:类继承与类组合,默认与含参的构造先后顺序 易错
    C++类继承与类组合,默认与含参的构造先后顺序 易错这道题原本是没有那么多输出信息的,是我自己加上了调用什么函数的提示。一开始以为就输出两行,一行是构造父类时A:5,一行是构造子类时x=5,A::x=5。#include"bits/stdc++.h"usingnamespacestd;classA{public:A(){......
  • c++的链接器
    C++链接器是一个编译器工具,用于将编译器生成的目标文件(通常是对象文件)链接在一起,以生成可执行文件或共享库。在C++编程中,链接器负责解析函数和变量的引用,并将它们关联到正确的定义位置。链接器的主要任务包括:1.**符号解析**:解析目标文件中使用的函数和变量的符号引用。当编译器......
  • 【C++ leetcode】双指针问题
    1.  611.有效三角形的个数题目给定一个包含非负整数的数组nums,返回其中可以组成三角形三条边的三元组个数。题目链接.-力扣(LeetCode)画图和文字分析判断是否是三角形要得到三边,由于遍历三边要套三层循环,时间复杂度很大,所以这里我们需要借助双指针思想,可......
  • 肖sir__pycharm安装2.2
    PyCharm安装使用教程Pycharm是目前Python语言最好用的集成开发工具。下载 Pycharm载时有两种版本选择 Professional(专业版,收费)和Community(社区版,免费)PyCharm是JetBrains公司(www.jetbrains.com)研发,用于开发 Python 的IDE开发工具。 JetBrains公司开发的多款......
  • 【C++从0到1-黑马程序员】类和对象(一)
     C++从0到1-黑马程序员 课程学习笔记课程链接: 16类和对象-封装-属性和行为作为整体_哔哩哔哩_bilibiliC++面向对象三大特性封装继承多态C++认为万事万物皆为对象,对象有其属性和行为1.封装1.1.封装的意义(1)将属性和行为作为一个整体,表现生活中的事物类中的属......
  • C++11新特性
    1、成员变量默认初始化:构建一个类的对象不需要用构造函数初始化成员变量。2、auto关键字:用于定义变量,编译器可以自动判断的类型(前提:定义一个变量时对其进行初始化);3、智能指针;4、空指针:空指针从指向NULL变为指向nullptr;通过将指针初始化为nullptr(nullptr直接代表指针空值类型),可......
  • RecursiveCharacterTextSplitter和CharacterTextSplitter代码随读
    直接说结论:优先使用RecursiveCharacterTextSplitter,输入一个separatorlist。优先划分大的符号放到前面,比如句号,分号,划分小块的放到后面。 如果想让separator不生效,就放一个原文中不会出现的一个符号,如果separator为空的话,会有一个默认值self._separators=separatorsor["......
  • 复试C++19真题_看程序写结果_前置++运算符重载 易错
    考察前置++运算符设置为友元函数,这题的坑在于,返回值是不是对象的引用,形参也不是对象的引用,导致自增离开了作用域以后就不在有任何效果。#include<iostream>usingnamespacestd;classC{private:intxx,yy;public:C(intx,inty):xx(x),yy(y){}friendC......
  • C++ Qt开发:QProcess进程管理模块
    Qt是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍如何运用QProcess组件实现针对进程的控制管理等。当你在使用Qt进行跨平台应用程序开发时,经常需要......