只是想知道为什么我们在C#(.NET)中有char
类型的2字节大小,而不像其他编程语言中的1字节?
答案 0 :(得分:32)
char是C#中的unicode,因此可能的字符数超过255.所以你需要两个字节。
例如,扩展ASCII具有255个字符集,因此可以存储在一个字节中。这也是System.Encoding
命名空间的全部目的,因为不同的系统可以有不同的字符集和字符大小。因此C#可以处理一个/四个/等。 char字节,但Unicode UTF-16是默认值。
答案 1 :(得分:23)
我猜测“其他编程语言”你的意思是C. C实际上有两种不同的char
类型:char
和wchar_t
。 char
可能只有一个字节,wchar_t
不一定。
在C#(和.NET)中,所有字符串都以UTF-16编码为Unicode。这就是为什么.NET中的char
表示单个UTF-16 代码单元,它可能是代码点或代理对的一半(实际上不是字符) ,然后)。
答案 2 :(得分:3)
实际上C#,或更准确地说CLR,char的大小与大多数其他托管语言一致。托管语言(如Java)往往更新,并且具有从头开始内置的unicode支持等项目。支持unicode字符串的自然扩展是具有unicode字符串。
C / C ++等旧语言仅以ASCII格式启动,后来才添加了unicode支持。
答案 3 :(得分:1)
因为C#字符串中的字符默认为Unicode的UTF-16编码,即2个字节(默认情况下)。
答案 4 :(得分:0)
因为.NET中的字符串被编码为2字节的Unicode字符。
答案 5 :(得分:0)
使用16位字符宽度的C#可能更多地与性能有关而不是其他任何东西。
首先,如果您使用UTF-8,您可以将每个角色都放在“正确”的空间中。这是因为UTF-8的宽度可变。 ASCII字符将使用8位,而较大的字符将使用更多。
但是可变长度字符编码在常见场景中鼓励 O(n)算法复杂化。例如。检索字符串中特定位置的字符。关于这一点已经进行了公开讨论。但最简单的解决方案是继续使用适合大多数charset的字符宽度,截断其他字符。现在你有一个固定的字符宽度。
严格来说,UTF-16也是一种可变宽度编码,因此C#(和Java就此而言)正在使用混合的东西,因为它们的字符宽度从不是32位。