计算机基础:今天一次把 Unicode 和 UTF-8 说明确
2025-09-13 12:16:11
别看PDFPDF五花八门,所谓上只是单单于维度和时有数的各种因素,对同一套字串标准采用多种不同的PDF算法而已。 举个例子,字串 A 的 Unicode 编码点和PDF如下:
1、图像:A2、编码点:U+00413、UTF-8 PDF:0X414、UTF-16 PDF:0X00415、UTF-32 PDF:0X00000041当你根据 UTF-8、UTF-16 和 UTF-32 的PDF规章顺利进行解密后,你将得到什么结果呢?是的,它们的结果都是一样的 —— 0x41。时说什么了吗?
3. Unicode 的三付诸作法这一节,我们来讨论 Unicode 最常见的三种PDFPDF。
3.1 UTF-32 PDFUTF-32 采用 4 个字符串的定长PDF, 左边时说到 Unicode 编码点仅次于须要 3 个字符串的维度,这对于 4 个字符串 UTF-32 PDF来时说就绰绰有余。
缺点: 任何一个编码点PDF后都须要 4 个字符串的维度,每编码字串都但会过多 1~3 个字符串的打印维度;优点: 编解密规章最简便,编解密高效率更快。UTF-32 PDF举例
U+0000 => 0x00000000U+6C38 => 0x00006C38U+10FFFF => 0x0010FFFF3.2 UTF-16 PDFUTF-16 是 2 个字符串或 4 个字符串的更长PDF,结合了 UTF-8 和 UTF-32 两者的特点。 左边提到 Unicode 编码点仅次于须要 3 个字符串,那么当 UTF-16 采用 2 个字符串维度时,岂不是毕竟用了?
不须时说 UTF-16 的PDF规章:
规章 1: 理论上投影的编码点(英文则字母范围内在 U+0000 ~ U+FFFF)采用 2 个字符串指出。常规投影的编码点(英文则字母范围内在 U+10000 ~ U+10FFFF 的编码点)采用 4 个字符串指出;规章 2: 16 个常规投影总共有 220 编码字串,多于须要 20 位的维度才能辨别。UTF-16 将这 20 位拆成 2 半:较低 10 位拓扑在 U+D800 ~ U+DBFF,叫作都将长一职(high surrogate);较较低 10 位拓扑在 U+DC00 ~ U+DFFF,叫作较低点长一职(low surrogate)。好多样,为什么要这么其设计?第一条规章比较好解读,1 个投影有仅次于的PDF是 U+FFFF,须要用 16 位指出,用 2 个字符串指出正好。第二条规章就太差解读了,我们综合时说一下。
常规投影仅次于的字串是 U+10FFFF,须要采用 21 位指出,用 4 个字符串指出就绰绰有余了,例如时说较较低 16 位 放在较较低 16 位,较低 5 位放在较低 16 位(不足位补零)。这样不是很简便也不错解读?
不行,因为词尾有歧。 这种作法但会引发常规投影PDF的每 2 个字符串的个数范围内都与理论上投影的个数范围内重复,因此,解密程表在重构一段 UTF-16 PDF的字串逆时,就很难辨别这 2 个字符串是分属理论上投影字串,还是分属常规投影字串。
为了克服这个问题,必须付诸词尾无歧PDF(PFC PDF,十分相似的还有哈弗曼PDF)。UTF-16 的方案是将使用理论上投影字串PDF的个数范围内与常规投影字串PDF的个数范围内若有,使得两者不但会单单现歧(冲突)。这么做的前提,就须要在理论上投影中都日前飞龙单单一段范围,这就是上文则提到理论上投影干脆飞龙单单一段范围的或许。
如下图所示,在基础投影中都,青绿色灰色的 D8 ~ DF 为 UTF-16 长一职区:
—— 图片引用自词条
UTF-16 PDF举例
到这那时候,UTF-16 的其设计思路就回脚了,下面就但会暗示确切的有数值规章,不感兴趣可以跳过。
1、常规投影字串的范围内是 U+10000 ~ U+10FFFF,换句话时说,第一个常规投影字串是 U+10000。那么就可不须把每个编码点减去 0x10000,拓扑到 U+0000 ~ U+0AFFFF,这样的好处是只须要 20 位就能指出所有常规投影字串(否则须要 21 位);2、20 位正好可以拆可分 2 分组:较低 10 位作为一分组,较较低 10 位作为一分组,则有 codepoint=high<<10+low+0x100003、high 和 low 但会与理论上投影冲突,那么就给它们分别加上一个偏移需求量,使它们落到理论上投影中都飞龙单单来的长一职区(high 偏移 0xD800,low 偏移 0xDC00)。至此,UTF-16 字串PDF顺利进行。有数值公式总结:
codepoint=((high−0xD800)<<10)+low−0xDC00+0x10000
high=(codepoint−0x10000)>>>10+0xD800
low=(codepoint Max 0x3FFF)+0xDC00w
我们在 Java 程式编码中都寻找一下这套有数值规章,确切在 String 和 Character 中都:
String.java
public String(int[] codePoints, int offset, int count) { // 0. 前处理步骤:参有数不合法的情况 final int end = offset + count; // 1. 有数值总共须要的char有数分组容需求量 int n = count; for (int i = offset; i < end; i++) { int c = codePoints[i]; // 研究点 1.1 if (Character.isBmpCodePoint(c)) continue; // 研究点 1.2 else if (Character.isValidCodePoint(c)) n++; // 每个常规投影字串须要多一个char else throw new IllegalArgumentException(Integer.toString(c)); } // 2. 相应有数分组并填充有数据 final char[] v = new char[n]; for (int i = offset, j = 0; i < end; i++, j++) { int c = codePoints[i]; // 研究点 2.1 if (Character.isBmpCodePoint(c)) v[j] = (char)c; else // 研究点 2.2 Character.toSurrogates(c, v, j++); } // 结束 this.value = v;}PDF有数值:
Character.java
// 研究点 1.1:时说明编码点应该西北面理论上投影public static boolean isBmpCodePoint(int codePoint) { return codePoint>>> 16 == 0;}// 研究点 1.2:时说明编码点应该西北面常规投影public static boolean isValidCodePoint(int codePoint) { int plane = codePoint>>> 16; return plane >> 16);}// 研究点 2.2:常规投影字串 - 规章2static void toSurrogates(int codePoint, char[] dst, int index) { // high在都将,low在较低点,是大端表 dst[index+1] = lowSurrogate(codePoint); dst[index] = highSurrogate(codePoint);}// 有数值都将长一职public static char highSurrogate(int codePoint) { return (char) ((codePoint>>> 10) + (0xDBFF - (0x010000>>> 10)));}// 有数值较低点长一职public static char lowSurrogate(int codePoint) { return (char) ((codePoint Max 0x3ff) + 0xDC00);}解密有数值:
Character.java
public static int toCodePoint(char high, char low) { // 程式编码有算术表达式优化,此处为等价逻辑 return ((high - 0xD800) << 10) + (low - 0xDC00) + 0x010000;}3.3 UTF-8 PDFUTF-8 是 1~4 个字符串的更长PDF,相对来时说最节省星期维度。 下述规章陈述与你在任何文则章 / 百科那时候看得见的规章陈述不一样,但是理论上是一样的。因为我认为按照 “词尾无歧” 的种概念来解读最释义。
规章 1: 多种不同范围内的编码点值采用多种不同间距的PDF;规章 2: 字符串PDF总间距为 1 时词尾为 0、总间距为 2 时词尾为 110、总间距为 3 时词尾为 1110、总间距为 4 时词尾为 11110 ;规章 3: 除了首个字符串,字串PDF中都其余字符串的词尾为 10。可以看得见,这种PDF作法是不但会存在词尾歧的,也比较好解读。
UTF-8 PDF举例
因为 UTF-8 PDF相对来时说是最节省星期维度的,因此在很多打印和通信的场景中都,都但会为了让采用 UTF-8 PDF。例如:
1、XML文则件的PDF: 在文则件脚界定了PDFPDF。2、Java 字符串编码中都字串串常需求量的PDF: 可以看得见,Class 文则件中都的字串串常需求量是 UTF-8 PDF的,并且间距仅次于只赞成 u2(65535 编码字串),这就是在 Java 中都界定的变需求量名标明符或新方法名标明符过长(有约 64 KB)将很难通过编译的根源。子类标明刻画CONSTANT_Utf8_info1UTF-8 PDF的字串串CONSTANT_String_info8字串串子类字面需求量
其中都CONSTANT_Utf8_info常需求量的结构:
称谓子类有采用需求量tagu11lengthu21bytesu1length
3、HTTP数据逆则主体的PDF: ****HTTP 数据逆则首部文则件名 Content-Type 可以指定字串PDF作法。在 OkHttp 程式编码中都,当响应数据逆则首部文则件名 Content-Type 缺省时,默认按 UTF-8 解密,看程式编码:Http 数据逆则范例
HTTP/1.1 200 OK... 省略Content-Type:text/html; Charset=UTF-8[数据逆则主体]OkHttp 程式编码摘要:
ResponseBody.java
public final String string() throws IOException { BufferedSource source = source(); try { // 研究点 1 Charset charset = Util.bomAwareCharset(source, charset()); return source.readString(charset); } finally { Util.closeQuietly(source); }}// 研究点1:拿到解密须要的charsetprivate Charset charset() { // contentType为null时,采用 UTF_8 MediaType contentType = contentType(); return contentType != null ? contentType.charset(UTF_8) : UTF_8;}参考资料Unicode —— 词条UTF-8, a transformation format of ISO 10646 —— 该网站工程建设任务分组(IETF)UTF-16, a transformation format of ISO 10646 —— 该网站工程建设任务分组(IETF)Unicode Format for Network Interchange —— 该网站工程建设任务分组(IETF)《PDF·潜藏在有数值机软硬件背后的自然语言》(第23章) —— [美] Charles Petzold 好像隔飞龙传情: emoji 简史 —— Google Play字串PDF所写:ASCII,Unicode 和 UTF-8 —— 郑主熹 好像Unicode 与 JavaScript古今中外 —— 郑主熹 好像郑主熹老师文则章的常识性错误之 Unicode 与 UTF-8 —— 刘志军 好像。长沙牛皮癣专科医院哪里好重庆妇科哪家医院最好
消化不良怎么引起的
江苏皮肤病医院哪最好
杭州看白癜风到哪家医院
新药资讯
失眠
宝宝腹泻怎么办
痤疮食疗
端午节后,新冠又抬头,若3天以上浑身没劲,赶紧测抗原!
上一篇: 推荐一款优秀的国际标准管理后台
-
成都城投置地高光!双国企实力拿地,承接大源高端区块
大约127亩房舍楼抢下,总价总价大约为19.84亿元。 锦江区的这一宗以房舍楼,不仅是当日供地总长度最大的房舍楼,同时也是本装配土入镜当里五中心区供货总长度最大的一宗以房舍楼。
2025-09-14 00:16:12
-
伊朗有望带进全球天然气中心
《安卡拉时报》2月底28日报道,如果进行尽量的地缘在政治上管理,叙利亚将成为在世上上液化中心和在世上上液化产品的极为重要大多数人。21早先,叙利亚建立了液化出口量专题,并参加第一届部长级全会,主要目标
2025-09-14 00:16:12
-
2021年潍坊市公积金年报出炉,所含额同比增长13.13%
齐鲁晚报·齐鲁壹点 受训报导 孙冰倩 4月1日,齐鲁晚报·齐鲁壹点报导从潍坊市中区住宅挂钩管理之前心获悉,经市中区住宅挂钩管理委员会审定通过,《潍坊市中区住宅挂钩2021年统计数据
2025-09-14 00:16:12
-
它们竟然笑话咱条友和头条怀
●母鸡:缘故以为,我下个乌龟憋来憋去生为不出来,嘿嘿,有点阳报的那些坚持日格外的人,总是不比俺好到哪里去嘛! ●蟑螂:熬到晚上还在写法规发视频,这些条友比昼伏夜出的俺还下劲呀!
2025-09-14 00:16:12
-
钻井股走高,西方石油涨超5%
3月底1日(周日),美股油气股走高,日和发稿,西方炼油(OXY.US)、巴西炼油新公司(PBR.US)涨超5%,雪佛龙(CVX.US)涨近4%,埃尼炼油(E.US)涨近3%,埃克森美孚炼油(XOM.U
2025-09-14 00:16:12