快速业务通道

使用Java语言进行Unicode代理编程 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-23
< 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代理编程(2)

时间:2010-11-20 IBM Masahiko Maedera

清单 2 中更新软件的方法很幼稚。它比较麻烦,需要大量修改 ,使得生成的软件很脆弱且今后难以更改。具体而言,这些问题是:

需 要计算码位的数量以分配足够的内存

很难获得字符串中的指定索引的正 确码位值

很难为下一个处理步骤正确移动当前索引

一个改进后的算法出现在下一个示例中。

示例:基本支持

Java 1.5 提供了 codePointCount()、codePointAt() 和 offsetByCodePoints() 方法来分别处理 示例 1-2 的 3 个问题。清单 3 使用 这些方法来改善这个算法的可读性:

清单 3. 基本支持

int[] toCodePointArray(String str) { // Example 1- 3   int len = str.length();     // the length of  str   int[] acp = new int[str.codePointCount(0, len)];   for (int i = 0, j = 0; i < len; i =  str.offsetByCodePoints(i, 1)) {     acp[j++] =  str.codePointAt(i);   }   return acp; }

但是,清单 3 的处理时间比 清单 1 长 2.8 倍。

示例 1-4:使用 codePointBefore()

当 offsetByCodePoints() 接收一个负数 作为第二个参数时,它就能计算一个距离字符串头的绝对偏移值。接下来, codePointBefore() 能够返回一个指定索引前面的码位值。这些方法用于清单 4 中从尾至头遍历字符串:

清单 4. 使用 codePointBefore() 的基本支持

int[] toCodePointArray(String str) { // Example 1-4     int len = str.length();     // the length of  str   int[] acp = new int[str.codePointCount(0, len)];   int j = acp.length;       // an index for acp   for (int i = len; i > 0; i =  str.offsetByCodePoints(i, -1)) {     acp[--j] =  str.codePointBefore(i);   }   return acp; }

使用Java语言进行Unicode代理编程(3)

时间:2010-11-20 IBM Masahiko Maedera

这个示例的处理时间 — 比 示例 1-1 长 2.72 倍 — 比 示例 1-3 快一些。通常,当您比较零而不是非零值时,JVM 中的代 码大小要小一些,这有时会提高性能。但是,微小的改进可能不值得牺牲可读性 。

示例 1-5:使用 charCount()

示例 1-3 和 1-4 提供基本的代 理对支持。他们不需要任何临时变量,是健壮的编码方法。要获取更短的处理时 间,使用 charCount() 而不是 offsetByCodePoints() 是有效的,但需要一个 临时变量来存放码位值,如清单 5 所示:

清单 5. 使用 charCount() 的优化支持

int[] toCodePointArray(String str) { //  Example 1-5    int len = str.length();     // 

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号