当前位置:七道奇文章资讯编程技术Java编程
日期:2011-03-22 16:15:00  来源:本站整理

操纵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编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:

  • 操纵javascript得到浏览器中的星号密码
  • 操纵Java运算符
  • 传送和操纵Java对象
  • 操纵Java技术将Atom转换为RDF
  • 操纵java成立躲藏文件
  • <b>操纵Java实现网络传输数据压缩的实例</b>
  • 操纵Java来实现域名和IP地址转换的操作
  • <b>操纵Java实现一个简单的递归算法的实例</b>
  • <b>操纵Java编写网络通信程序</b>
  • 操纵Java Applet播放声音文件
  • 操纵Java语言举行Unicode代理编程
  • 操纵Java3D实现三维图象
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .