C#中string在内存中是如何表示的
不知道你是否有过和我一样的疑问,不同编码的字符串是如何存储在运行时的内存中的呢,计算机在操作string类型的对象时,如何知道这个string是什么编码呢?和文本文件那样有类似BOM的东东在string对象里?
答案是,内存中是无关编码的。统一使用UCS2(注意,这里为什么不说是UTF16,见下文)编码(大小端应该是和计算机CPU有关,intel的应该是小端)存放在内存中。
string对象和IO交互时,分别根据方法中的Encoding去处理来自IO的字节,或者转换成Encoding所指示的编码的字节流作为IO输出。
另外,上文提到内存中使用的是UCS2而不是UTF16,意思是,对于Unicode编码值大于0xFFFF的编码,C#和java一样,是转换成“代理对”(2*2字节)表示的。所以,如果string中含有类似emoji那样的“大”字符时,string的Length方法返回的字符串长度是不正确的。解决方案是,使用StringInfo类中的LengthInTextElements。
PS:System.Text.Encoding中的Unicode和BigEndianUnicode实际是UTF16,微软一定有它的道理。只是我不清楚。
C#中string在内存中是如何表示的的更多相关文章
- 一个 -100.01 的double 在内存中怎么存储的. 一个中文String 在内存中占多少直接 utf-8 / GBK
一.-100.01 的double 在内存中怎么存储的 double双精度数据类型存储格式IEEE 双精度格式为8字节64位,由三个字段组成:52 位小数 f : 11 位偏置指数 e :以及 1 位 ...
- String在内存中如何存储(Java)
JDK1.8中JVM把String常量池移入了堆中,同时取消了“永久代”,改用元空间代替(Metaspace)java中对String对象特殊对待,所以在heap区域分成了两块,一块是字符串常量池(S ...
- STL库中string类内存布局的探究
在STL中有着一个类就是string类,他的内存布局和存储机制究竟是怎么样的呢? 这就是建立好的string 可以看出,图中用黄色框框标注的部分就是主要区域 我们用来给string对象进行初始化的字符 ...
- String 在内存中如何存储的
基本数据类型由于长度固定,且需要空间比较少,所以直接存储在栈中:而对象比较大,所以栈中只存储一个4btye的引用地址(逻辑地址). java中对String对象特殊对待,所以在heap区域分成了两块: ...
- Android中string.xml文件中设置部分字体颜色大小
1.在string.xml文件中: <string name="tips_all"><Data><![CDATA[清理进程:<font colo ...
- VB6之多维数组中元素在内存中的排列情况
Private Declare Sub RtlMoveMemory Lib "kernel32" (Destination As Any, Source As Any, ByVal ...
- Java中数组在内存中的图解
Java中的数组在内存中的图解,其实对于数组,还是比较熟悉的,平时用的也是很多的,在看数据结构与算法的极客时间专栏,最常用的10个数据结构:数组.链表.栈.队列.散列表.二叉树.堆.跳表.图.Trie ...
- C语言中浮点数在内存中的存储方式
关于多字节数据类型在内存中的存储问题 //////////////////////////////////////////////////////////////// int ,short 各自是4. ...
- python中变量在内存中的存储与地址关系解析、浅度/深度copy、值传递、引用传递
---恢复内容开始--- 1.变量.地址 变量的实现方式有:引用语义.值语义 python语言中变量的实现方式就是引用语义,在变量里面保存的是值(对象)的引用(值所在处内存空间的地址).采用这种方式, ...
随机推荐
- 作品-网站 - [二次开发] 广联达BIM
客户地区:北京 基于帝国ECMS二次开发 网址:http://bim.glodon.com 开发性质:二次开发 网站类型:企业级
- oracle V$SESSION各个字段的含义
源地址:https://zhidao.baidu.com/question/345549929.html SADDR - session addressSID - session identifier ...
- [C#对sql操作]C#对sql server 2008数据库操作
using System.Data; using System.Data.SqlClient SqlConnection conn = new SqlConnection(System.Configu ...
- [源码]DataIOStream 数据流 处理基本数据类型的流
纵骑横飞 章仕烜 首先我们来看一下 DataOutputStream /** * A data output stream lets an application write primit ...
- Android 组件类继承关系结构图
- 判断一个数num是否是2的幂(乐视题)
思路“num &(num-1)==0 返回true,否者返回false.代码如下: boolean isPower(int num){ if(num<=0) return false; ...
- (推荐)WPF动画教程
无意间发现博主的文章,记录推荐一下. http://www.cnblogs.com/alamiye010/archive/2009/06/17/1505346.html http://www.cnbl ...
- Windows Linux 之间rsync同步CODE文件
Windows Linux 之间rsync同步CODE文件 一.环境Windows:OS:Microsoft Windows Web Server 2008 SP1IP:192.168.88.197 ...
- js prepend() 和append()区别
prepend() 方法在被选元素的开头(仍位于内部)插入指定内容.prepend() 语法:$(selector).prepend(content) 或 $(selector).prepend(fu ...
- sql参数化查询in的参数
private Query setParameter(Query query, Map<String, Object> map) { if (map != null) { Set<S ...