C#中string在内存中是如何表示的
2015-12-03 15:58
603 查看
不知道你是否有过和我一样的疑问,不同编码的字符串是如何存储在运行时的内存中的呢,计算机在操作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,微软一定有它的道理。只是我不清楚。
答案是,内存中是无关编码的。统一使用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#访问修饰符(Public/Private/Protected/Internal)
- REST: C#调用REST API (zz)
- C# UserControl 判断DesignMode
- C# int? int区别
- c# 扩展方法奇思妙用
- C#学习
- 换行符问题
- 开机自启动(C#)
- 操作xml(C#)
- 隐藏到托盘(C#)
- 火狐浏览器下请求两次(C#)
- (转)C#程序以管理员权限运行
- C#类中的属性使用总结(详解类的属性)
- C# 取得网址源码
- c#零碎知识随笔
- C#单例模式的三种写法
- C#利用反射遍历对象的属性和属性值
- [摘录]解决C# DateTime去掉时分秒几种方法
- C#怎么实现手机短信发送功能
- 详解C#打开和关闭可执行文件