1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > Unity中获取字符串长度 Unicode字符数量和编码ASCII UTF GBK的区别

Unity中获取字符串长度 Unicode字符数量和编码ASCII UTF GBK的区别

时间:2022-12-15 08:12:43

相关推荐

Unity中获取字符串长度 Unicode字符数量和编码ASCII UTF GBK的区别

1.String.Length,String.ToCharArray,StringInfo,Encoding.UTF8.GetByteCount的区别:

String.Length:获取的是字符串中Char的数量,而不是Unicode字符的数量

String.ToCharArray也是将string转换成Char数组。

StringInfo:若要获取字符串中的Unicode字符数量,而需要使用“System.Globalization.StringInfo”

GetByteCount:获取字符串的字节数量,同一Unicode字符根据不同的编码方式会有不同的字节长度,因此需要在代码中指明转换格式“Encoding.UTF8.GetByteCount”

注意:在C#中对字符串默认使用UTF16编码,一个Char占两个字节,所以String.Length,String.ToCharArray在计算Char数量时都是按照UTF16的标准对字符串进行编码

string str = "CN是😁";char[] charArr = str.ToCharArray();Debug.LogFormat("Char长度: {0}, {1}", str.Length, charArr.Length);StringInfo strInfo = new StringInfo(str);Debug.LogFormat("Unicode字符长度:{0}", strInfo.LengthInTextElements);int unicodeLen = Encoding.Unicode.GetByteCount(str);int utf8Len = Encoding.UTF8.GetByteCount(str);int utf32Len = Encoding.UTF32.GetByteCount(str);Debug.LogFormat("不同编码的字节长度: Unicode - {0}, UTF8 - {1}, UTF32 - {2}", unicodeLen, utf8Len, utf32Len);

输出结果:

解析:

1.以上代码中Emoji符号“😁”的Unicode编码是:0x1F601。Emoji是Unicode编码的一部分,位于第0和1平面内,大部分位于第1平面,有一部分简单的Emoji位于第0平面。Emoji的Unicode编码范围:Emoji unicode characters for use on the web

2.在C#中默认使用UTF16编码,一个Char占两个字节,共16位。String.Length默认使用UTF16来计算Char数量,一个英文占用1个Char,常用汉字位于第0平面中Unicode编码大于“2E80”的部分,因此也只占用1个Char。Emoji表情的Unicode编码为0x1F601,在UTF16中借助高低代理对,需要占用两个Char对该Emoji表情编码。所以以上代码输出结果:Char长度为5

3.StringInfo获取到的是该字符串中Unicode字符的个数,Emoji表情“😁”无需修饰符,因此只需要一个Unicode字符即可表示。所以输出结果:Unicode字符长度为4。

PS:部分Emoji表情需要多个Unicode拼接而成,因此一个Emoji表情有可能需要多个Unicode。各个Emoji表情的Unicode编码可查看:Emoji unicode characters for use on the web

4.Encoding.Unicode:默认使用的是UTF16编码标准,由于UTF16是最早推出的Unicode编码格式,UTF8、UTF32都是后来发展的,而且在C#中默认使用UTF16对string进行编码,因此这里获取byte数量时也是按照UTF16来计算。通过以上知道该String一共5个Char,因此总byte数量为10

Encoding.UTF8:英文字符属于ASCII范围内,数值较小,只占用一个字节,汉字位于Unicode第0平面中编码大于“2E80”的部分,添加码头进行编码后需要占用3个字节(详细编码过程可参看UTF8解析),而Emoji表情“😁”位于第1平面,需要占用4个字节。所以总Byte数量为9

Encoding.UTF32:由于UTF32中共有32位用于编码,远远大于Unicode需要的21位,因此Unicode编码可以不经过任何转换(如UTF8中添加码头,UTF16中添加高低代理对)直接作为最后的UTF32编码,不足32位的位数则用0补足(不影响原有Unicode编码数值)。并且UTF32使用定长编码,每个Unicode字符使用4个字节,所以总Byte数量为16

注意:Encoding.Default —— 当前机器的默认编码,在简体中文系统上是GB2312,在繁体中文系统是BIG5,在英文系统上可能是Latin/Western European。由于各个设备默认编码不一致,考虑到软件兼容,尤其是需要跨设备传递数据的应用,一般不会在实际中使用Encoding.Default。

2.UTF8、UTF16、UTF32的区别:

在UTF8标准下,对于比较简单的ASCII编码“0 - 127”,则直接使用一个字节即可;对于“0x80 - 0x07FF”的Unicode字符,则使用两个字节;常用的汉字位于第0平面中编码大于“2E80”,则使用3个字节;第1-16平面的Unicode字符则使用4个字节。

UTF8的特性是对不同范围的Unicode字符使用不同字节长度的编码。基于此特性,针对某些英文字符占多数,汉字占少数的文本,如代码脚本文件、与服务器通信的数据流,通常都使用UTF8来编码

Unicode字符平面分布:

PS: 汉字在UTF8标准下的编码过程

注意:

1.在编码过程中会对需要的各个字节部分添加码头,因此UTF8标准的汉字会增加至3个字节

2.在任何标准下,包括UTF8,UTF16,UTF32,任何一个Unicode字符最多使用4个字节,因为Unicode的编码范围是0 ~0x10FFFF,最多需要21位,而4个字节共32位,完全可以表示任何一个Unicode字符。但有的表情可能需要多个Unicode字符拼接而成

UTF32标准下,由于Unicode字符编码范围是从0 ~ 0x10FFFF,一共需要21位,因此在UTF32格式下不需要对Unicode编码做任何处理,直接使用Unicode编码作为UTF转换后的编码,不足位用0补齐。由于UTF32采用定长格式,因此每个Unicode都使用4个字节。

UTF32的优点:不需要对Unicode编码做任何转换处理,相比于UTF8 和 UTF32省去了编码和解码的步骤,因此对于字符串的处理速度是三种编码中最快的

UTF32的缺点:由于采用定长编码并且有大量冗余位,因此非常占用存储空间。既不是最早推出的编码方式(最早推出的是UTF16),也不是最优设计的(公认最优编码是UTF8),在实践中使用很少,基本已被淘汰

UTF16标准:采用16位定长编码,受限于16位能够表示的范围限制(0x0000 ~ 0xFFFF),故引入高低代理对的功能,实现第1 ~ 16平面的Unicode字符编码(0x10000 ~ 0x10FFFF)。

将第0平面中前面6位“1101 10”和“1101 11”保留下来作为高低代理对标识来使用。C#中提供了判断Char是否是高低代理对的接口:

UTF16编码过程:例如第1平面Unicode字符“0x1F601”

注意:

1.在.Net中,使用UTF16编码,一个Char占两个字节,共16位,因此“Char”刚好相当于UTF16中的一个基本计量单位。常用汉字位于第0平面中编码大于“2E80”的部分,只需要一个Char即可表示。

2.表意文字:古埃及文字、象形文字、楔形文字等,通常位于第1 ~ 16平面中,在UTF-16编码中需要两个Char才能表示。

3.在C#中默认使用UTF16对字符串进行编码,String.Length得到的是string中的Char数量,String.ToCharArray也是将String转换成Char数组

3.ASCII码,Unicode码,UTF的区别

ASCII码:代表0 ~ 127的常用字符的编码,全称是American Standard Code for Information Interchange,即美国信息交换标准代码,主要用于英语字符的显示。

Unicode码:由于世界上有多种语言字符,数量越来越多,因此在综合了各种语言后推行一种统一的编码标准,是世界范围内广泛使用。跟秦始皇“车同轨,书同文”一样,大大方便了交流沟通(在计算机层面上),这就是Unicode编码。好处在于既保留了传统ASCII编码,0 ~ 127依然代表原来的ASCII字符,又扩展了更多的语言,因此更加便于流通。Unicode编码范围是:0 ~ 0x10FFFF

UTF:全称是Unicode Transformation Format,是Unicode编码的实现方式,UTF8, UTF16, UTF32是Unicode的三种实现方式,将同一个Unicode编码用不同的转换标准进行转换,将转换后的编码用于文件存储或数据通信。

注意:不可以直接使用Unicode编码本身,由于各个Unicode编码不同,有的很简单如0, 有的很复杂如0xFFFF,在解码时没有固定的标准是无法解析出正确的字符的。为了兼顾各个Unicode的差异,以及节省存储空间,出现了UTF8, UTF16, UTF32等多种编码标准。实质上都是Unicode字符的一种实现方式

4.ASCII,GB2312,GBK的区别:

GB2312:GB2312使用2个字节,共收录了6763个汉字和682个特殊符号,已经包含了生活中常用的99%的汉字了,兼容ASCII中128个字符;

GBK:GBK对GB2312进行扩充,但仍旧使用2个字节,兼容GB2312的所有字符,共收录20902个汉字和984个标点、偏旁部首等,并且包含了繁体字。基本上已经收录了所有的汉字,有些收录的汉字甚至我们永远也不会看到。

也是基于这样的原因,我们常用的中文机器上使用的都是GB2312编码,一则是GB2312已经包含了生活中常用的99%的汉字,另外GBK中收录的汉字过多,有些汉字甚至完全不会见到,因此在实际使用中大多使用GB2312作为中文机器的默认编码

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。