快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-23
3)、(4) 和 (6) 中,char 类型的 索引通过 offsetByCodePoints() 用码位索引替代。

基本的算法流与 示 例 2-1 中的看起来几乎一样。但处理时间根据字符串长度与示例 2-1 的比率同 比增加,因为 offsetByCodePoints() 总是从字符串头到指定索引计算字符串内 部。

示例 2-3:减少的处理时间

可以使用清单 10 中展示的方法 来避免 示例 2-2 的性能问题:

清单 10. 改进的性能

String[] sliceString(String str, int width) { //  Example 2-3   // It must be that "str != null  && width > 0".   List<String> slices =  new ArrayList<String>();   int len = str.length();  // (1) the length of str   int sliceLimit     //  (2) Do not slice beyond here. [Modified]       =  (len >= width * 2 || str.codePointCount(0, len) >  width)       ? str.offsetByCodePoints(len, -width) :  0;   int pos = 0;      // the current position per  char type   while (pos < sliceLimit) {      int begin = pos;                // (3)     int end  = str.offsetByCodePoints(pos, width); // (4)  [Modified]     slices.add(str.substring(begin, end));     pos = end;                   // (5)  [Modified]   }   slices.add(str.substring(pos));            // (6)   return slices.toArray(new String [slices.size()]); }

首先,在 Line (2) 中,(清单 9 中的 )表达式 len-width 被 offsetByCodePoints(len,-width) 替代。但是,当 width 的值大于码位的数量时,这会抛出一个 IndexOutOfBoundsException 实 例。必须考虑边界条件以避免异常,使用一个带有 try/catch 异常处理程序的 子句将是另一个解决方案。如果表达式 len>width*2 为 true,则可以安全 地调用 offsetByCodePoints(),因为即使所有码位都被转换为代理对,码位的 数量仍会超过 width 的值。或者,如果 codePointCount(0,len)>width 为 true,也可以安全地调用 offsetByCodePoints()。如果是其他情况, sliceLimit 必须设置为 0。

在 Line (4) 中,清单 9 中的表达式 pos + width 必须在 while 循环中使用 offsetByCodePoints(pos,width) 替换。需 要计算的量位于 width 的值中,因为第一个参数指定当 width 的值。接下来, 在 Line (5) 中,表达式 pos+=width 必须使用表达式 pos=end 替换。这避免 两次调用 offsetByCodePoints() 来计算相同的索引。源代码可以被进一步修改 以最小化处理时间。

处理时间比较

图 1 和图 2 展示了示例 2-1 、2-2 和 2-3 的处理时间。样例字符串包含相同数量的代理对和非代理对。当 字符串的长度和 width 的值被更改时,样例字符串被切割 10,000 次。

图 1. 一个分段的常量宽度

图 2. 分段的常量计数

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

时间:2010-11-20 IBM Masahiko Maedera

示例 2-1 和 2-3 按照长度比例增加了它们的处理时间,但 示例 2-2 按照长度的平方比例增加了处理时间。当字符串长度和 width 的值增加而分段 的数量固定时,示例 2-1 拥有一个常量处理时间,而示例 2-2 和 2-3 以 width 的值为比例增加了它们的处理时间。

信息 API

大多数处理 代理的信息 API 拥有两种名称相同的方法。一种接收 16 位 char 类型参数, 另一种接收 32 为码位参数。表 2 展示了每个 API 的返回值。第三列针对 U+53F1,第 4 列针对 U+20B9F,最

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号