操纵Java语言举行Unicode代理编程[Java编程]
本文“操纵Java语言举行Unicode代理编程[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
早期 Java 版本利用 16 位 char 数据范例表示 Unicode 字符.这种计划方 法有时对比公道,因为全部 Unicode 字符拥有的值都小于 65,535 (0xFFFF), 可以通过 16 位表示.但是,Unicode 后来将最大值增添到 1,114,111 (0x10FFFF).由于 16 位太小,不能表示 Unicode version 3.1 中的全部 Unicode 字符,32 位值 — 称为码位(code point) — 被用于 UTF-32 编码情势.
但与 32 位值相比,16 位值的内存利用效率更高, 因此 Unicode 引入了一个种新计划办法来答应持续利用 16 位值.UTF-16 中采 用的这种计划办法分配 1,024 值给 16 位高代理(high surrogate),将别的 的 1,024 值分配给 16 位低代理(low surrogate).它利用一个高代理加上一 个低代理 — 一个代理对(surrogate pair) — 来表示 65,536 (0x10000) 和 1,114,111 (0x10FFFF) 之间的 1,048,576 (0x100000) 值 (1,024 和 1,024 的乘积).
Java 1.5 保存了 char 范例的行为来表 示 UTF-16 值(以便兼容现有程序),它实现了码位的概念来表示 UTF-32 值.这个扩大(按照 JSR 204:Unicode Supplementary Character Support 实现) 不需求记着 Unicode 码位或转换算法的精确值 — 但理解代理 API 的正 确用法很重要.
东亚国家和区域近些年来增添了它们的字符集合的字符数 量,以满意用户需求.这些尺度包含来自中国的国家尺度组织的 GB 18030 和来 自日本的 JIS X 0213.因此,追求服从这些尺度的程序更有必要支持 Unicode 代理对.本文注释相关 Java API 和编码选项,面向筹划重新计划他们的软件, 从只能利用 char 范例的字符转换为可以处理代理对的新版本的读者.
次序拜候
次序拜候是在 Java 语言中处理字符串的一个基本操作.在 这种办法下,输入字符串中的每个字符重新至尾按次序拜候,大概有时从尾至头 拜候.本小节谈论利用次序拜候办法从一个字符串成立一个 32 位码位数组的 7 个技术示例,并预计它们的处理时间.
示例 1-1:基准测试(不支持代 理对)
清单 1 将 16 位 char 范例值直接分配给 32 位码位值,完好没 有考虑代理对:
清单 1. 不支持代理对
int[] toCodePointArray(String str) { // Example 1-1
int len = str.length(); // the length of str
int[] acp = new int[len]; // an array of code points
for (int i = 0, j = 0; i < len; i++) {
acp[j++] = str.charAt(i);
}
return acp;
}
固然这个示例不支持代理对,但它供应了一个处理时间基准来比 较后续次序拜候示例.
示例 1-2:利用 isSurrogatePair()
清单 2 利用 isSurrogatePair() 来计算代理对总数.计数之后,它分配充足的内存 以便一个码位数组存储这个值.然后,它进入一个次序拜候循环,利用 isHighSurrogate() 和 isLowSurrogate() 肯定每个代理对字符是高代理还是低 代理.当它发现一个高代理背面带一个低代理时,它利用 toCodePoint() 将该 代理对转换为一个码位值并将当前索引值增添 2.不然,它将这个 char 范例值 直接分配给一个码位值并将当前索引值增添 1.这个示例的处理时间比 示例 1 -1 长 1.38 倍.
清单 2. 有限支持
int[] toCodePointArray(String str) { // Example 1-2
int len = str.length(); // the length of str
int[] acp; // an array of code points
int surrogatePairCount = 0; // the count of surrogate pairs
for (int i = 1; i < len; i++) {
if (Character.isSurrogatePair(str.charAt(i - 1), str.charAt(i))) {
surrogatePairCount++;
i++;
}
}
acp = new int[len - surrogatePairCount];
for (int i = 0, j = 0; i < len; i++) {
char ch0 = str.charAt(i); // the current char
if (Character.isHighSurrogate(ch0) && i + 1 < len) {
char ch1 = str.charAt(i + 1); // the next char
if (Character.isLowSurrogate(ch1)) {
acp[j++] = Character.toCodePoint(ch0, ch1);
i++;
continue;
}
}
acp[j++] = ch0;
}
return acp;
}
以上是“操纵Java语言举行Unicode代理编程[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |