将中文字符存入std::string时究竟发生了什么

ByteFlys 2019-12-10 05:30:18
加精
std::string本质上是一个char数组,每个字符都是单字节的
但是中文不管什么编码,至少得占两个字节,那么是怎么存入char的
是一个字符占两个字节存储,还是截断存储,这是第一个问题

还有一个问题,中文字符存入std::string时,究竟以什么编码存储的
用的是操作系统默认编码,还是IDE默认编码,或者默认Unicode?

...全文
6066 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
紫火桑葚 2019-12-16
精选
  • 打赏
  • 举报
回复 3
虽然已经结帖,还是回复下; 你可以认为所有数字、字母、符号、汉字、特殊符号, 其实都有相应编号,而数字、字母、大部分常用符号的编号, 都在127以内,而汉字编号都大于127, 1byte可用于编号表示的范围是0~127, 啥?瞎扯淡?为啥不是255呢? 因为要区分是否需要多个byte组合表示完整的汉字, 最高位永远为0,即01111111=127, 显然UTF8编码无法用1byte表示完整的汉字, 所以汉字编号会被拆开成若干个部分, 最直观的做法是把编号转换成二进制表示, 例如汉字"你"的编号是0x4f60, 对应二进制:‭0100111101100000‬, 从右往左拆分,按照每6个位截取一次, 得到:‭0100 111101 100000,最少需要3byte 加上相应的前缀得到:‭11100100 10111101 10100000, 所以这就是汉字所占用的3字节~
qq_42820555 2020-05-06
  • 打赏
  • 举报
回复
std::string本质上是一个char数组,每个字符都是单字节的
但是中文不管什么编码,至少得占两个字节,那么是怎么存入char的
是一个字符占两个字节存储,还是截断存储,这是第一个问题

还有一个问题,中文字符存入std::string时,究竟以什么编码存储的
用的是操作系统默认编码,还是IDE默认编码,或者默认Unicode?
我叫RT 2020-04-06
  • 打赏
  • 举报
回复
学习了。最近刚好对这方面有点迷糊。
Varible 2020-03-10
  • 打赏
  • 举报
回复
两个字节储存,输出两个一起会自动合并吧!
补充:中文OEM自动合并,美文模式乱码散架,我猜的……^ _ ^
许文君 2020-01-04
  • 打赏
  • 举报
回复
引用 7 楼 truexf 的回复:
和编辑器的字符集格式有关。最终都会被转换为一个char string的底层是char数组,不会有任何字符集的处理。这些是程序员自己决定的。
sdghchj 2020-01-03
  • 打赏
  • 举报
回复 1
地上有一坨,人看它是屎,狗看它是食。它还是它,没有改变,变的是谁在看它。
阿五-哈默迪 2019-12-30
  • 打赏
  • 举报
回复
不..... 每个字符一个字节那是你以为的 至于是不是,要看如何解释。 我觉得就是直接存储进去了
raymendyes 2019-12-26
  • 打赏
  • 举报
回复
感谢楼主分享,正学习中
「已注销」 2019-12-23
  • 打赏
  • 举报
回复
学习中,感谢
clselectt 2019-12-20
  • 打赏
  • 举报
回复
顶起来。。。。。。。。。。。。。。
zealman 2019-12-20
  • 打赏
  • 举报
回复
帮你顶一下和学习吧。。。。。。。。。。。
sichuanwww 2019-12-19
  • 打赏
  • 举报
回复
magicjym 2019-12-17
  • 打赏
  • 举报
回复
感谢楼主分享,正学习中
CWAAAA 2019-12-15
  • 打赏
  • 举报
回复
多谢!!!!!!!!!!!!!!!!!!!!
yanghanyuze 2019-12-15
  • 打赏
  • 举报
回复
typedef basic_string<wchar_t, char_traits<wchar_t>,allocator<wchar_t> > wstring;
nmslswsd 2019-12-13
  • 打赏
  • 举报
回复
学习中,感谢
梦想不加班 2019-12-13
  • 打赏
  • 举报
回复 1
第一个问题,string是以结束符来看长度的,转char也是同样的,遇到‘\0’才认为string结束,与内容无关。
第二个问题,中文转string是根据你的编译器来决定以哪种格式存储的,长度也不是你说的2个字节,而是根据编码格式来决定长度的。一般的格式为ASCII或者Unicode。同样的,读取时候一般都会让你指定编码类型,如json System.Text.Encoding.Default.GetString(bytes, 0, len)或者System.Text.Encoding.Unicode.GetString(bytes, 0, len)。
weixin_46018948 2019-12-13
  • 打赏
  • 举报
回复
将char*赋值给std::string如果不指定长度,则会默认以\0截断(ASCII码值为0);如果指定的长度超过char*字符串
ByteFlys 2019-12-13
  • 打赏
  • 举报
回复
简单来说,string以ANSI编码(编码方式由本地环境决定)来存储字节,但以ASCII/Unicode来读取字节 wstring以ASCII/Unicode编码来存储字节,同样以ASCII/Unicode来读取字节 博客总结如下:C++中char,wchar,string,wstring https://hellogoogle.blog.csdn.net/article/details/103469251
finder_zhang 2019-12-13
  • 打赏
  • 举报
回复
首先跳到 string 的定义,看看他是什么 typedef basic_string<char> string; basic_string 是一个模版 另外还可以看到其他的定义 typedef basic_string<wchar_t> wstring; typedef basic_string<char32_t> u32string; 看到这里应该很清晰了,string 是对 char[] 的封装 wstring 是对 wchar_t[] 的封装 如果是 unicode32 编码,要用 u32string ,如果是 unicode16 编码,要用 wstring ,而 string ,很厉害,无论什么编码都可以放进去,因为他是一个字节一个字节地放的,只要你知道string里面是什么编码,再用对应的编码读出来就可以了. 将中文放入 string 会发生什么,这个我实际测过,首先你要设置好你IDE编辑的字符编码,如果你设成gbk,那么string="中国",这个string就占4个字节,如果你编辑器是utf-8,那么你的 string="中国",就会占 6 个字节.
加载更多回复(6)

65,207

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧