Module java.desktop
Package java.awt.font

Class NumericShaper

java.lang.Object
java.awt.font.NumericShaper
所有实现的接口:
Serializable

public final class NumericShaper extends Object implements Serializable
NumericShaper类用于将拉丁-1(欧洲)数字转换为其他Unicode十进制数字。使用此类的用户主要是希望使用国家数字形状呈现数据的人,但发现使用拉丁-1(欧洲)数字在内部表示数据更方便。这不会解释已弃用的数字形状选择器字符(U+206E)。

NumericShaper的实例通常作为TextAttribute类的NUMERIC_SHAPING属性应用于文本。例如,此代码片段使TextLayout在阿拉伯语环境中将欧洲数字形状为阿拉伯数字:

 Map map = new HashMap();
 map.put(TextAttribute.NUMERIC_SHAPING,
     NumericShaper.getContextualShaper(NumericShaper.ARABIC));
 FontRenderContext frc = ...;
 TextLayout layout = new TextLayout(text, map, frc);
 layout.draw(g2d, x, y);
 

还可以使用NumericShaper的实例显式执行数字形状,如下代码片段所示:
 char[] text = ...;
 // 将所有欧洲数字(零除外)形状为阿拉伯数字
 NumericShaper shaper = NumericShaper.getShaper(NumericShaper.ARABIC);
 shaper.shape(text, start, count);

 // 如果前面的文本是阿拉伯文,则将欧洲数字形状为阿拉伯数字,或者
 // 如果前面的文本是泰米尔文,则将欧洲数字形状为泰米尔数字,或者
 // 如果没有前面的文本,或者
 // 前面的文本既不是阿拉伯文也不是泰米尔文,则保留欧洲数字不变
 NumericShaper shaper =
     NumericShaper.getContextualShaper(NumericShaper.ARABIC |
                                         NumericShaper.TAMIL,
                                       NumericShaper.EUROPEAN);
 shaper.shape(text, start, count);
 

基于位掩码和枚举的Unicode范围

此类支持两种不同的编程接口来表示特定脚本数字的Unicode范围:基于位掩码的接口,如NumericShaper.ARABIC,和基于枚举的接口,如NumericShaper.Range.ARABIC。可以通过OR位掩码常量指定多个范围,例如:

 NumericShaper.ARABIC | NumericShaper.TAMIL
 
或使用NumericShaper.Range常量创建Set,例如:
 EnumSet.of(NumericShaper.Range.ARABIC, NumericShaper.Range.TAMIL)
 
基于枚举的范围是基于位掩码的范围的超集。

如果混合使用这两个接口(包括序列化),则Unicode范围值将映射到可能的对应值,例如从NumericShaper.ARABICNumericShaper.Range.ARABIC。如果指定了任何不可映射的范围值,例如NumericShaper.Range.BALINESE,则将忽略这些范围。

十进制数字优先级

一个Unicode范围可能有多组十进制数字。如果为同一Unicode范围指定了多组十进制数字集,其中一组将按照以下方式优先:

NumericShaper常量优先级
Unicode范围 NumericShaper常量 优先级
阿拉伯语 NumericShaper.ARABIC
NumericShaper.EASTERN_ARABIC
NumericShaper.EASTERN_ARABIC
NumericShaper.Range.ARABIC
NumericShaper.Range.EASTERN_ARABIC
NumericShaper.Range.EASTERN_ARABIC
泰坦语 NumericShaper.Range.TAI_THAM_HORA
NumericShaper.Range.TAI_THAM_THAM
NumericShaper.Range.TAI_THAM_THAM
自1.4版本起:
1.4
参见:
  • Nested Class Summary

    Nested Classes
    Modifier and Type
    Class
    Description
    static enum 
    NumericShaper.Range表示具有自己十进制数字的脚本的Unicode范围。
  • Field Summary

    Fields
    Modifier and Type
    Field
    Description
    static final int
    用于完整的上下文形状标识所有范围。
    static final int
    标识阿拉伯范围和十进制基数。
    static final int
    标识孟加拉范围和十进制基数。
    static final int
    标识梵文范围和十进制基数。
    static final int
    标识阿拉伯范围和扩展的阿拉伯十进制基数。
    static final int
    标识埃塞俄比亚范围和十进制基数。
    static final int
    标识拉丁-1(欧洲)和扩展范围,以及拉丁-1(欧洲)十进制基数。
    static final int
    标识古吉拉特范围和十进制基数。
    static final int
    标识果鲁穆奇范围和十进制基数。
    static final int
    标识卡纳达范围和十进制基数。
    static final int
    标识高棉范围和十进制基数。
    static final int
    LAO
    标识老挝范围和十进制基数。
    static final int
    标识马拉雅拉姆范围和十进制基数。
    static final int
    标识蒙古范围和十进制基数。
    static final int
    标识缅甸范围和十进制基数。
    static final int
    标识奥里亚范围和十进制基数。
    static final int
    标识泰米尔范围和十进制基数。
    static final int
    标识泰卢固范围和十进制基数。
    static final int
    标识泰语范围和十进制基数。
    static final int
    标识藏文范围和十进制基数。
  • Method Summary

    Modifier and Type
    Method
    Description
    boolean
    如果指定的对象是NumericShaper的实例并且与此实例形状相同,则返回true,无论范围表示、位掩码还是枚举如何。
    static NumericShaper
    getContextualShaper(int ranges)
    为提供的Unicode范围返回上下文形状器。
    static NumericShaper
    getContextualShaper(int ranges, int defaultContext)
    为提供的Unicode范围返回上下文形状器。
    static NumericShaper
    为提供的Unicode范围返回上下文形状器。
    static NumericShaper
    为提供的Unicode范围返回上下文形状器。
    int
    返回将要形状的所有范围的值的OR结果。
    返回表示将要形状的所有Unicode范围的Set
    static NumericShaper
    getShaper(int singleRange)
    为提供的Unicode范围返回形状器。
    static NumericShaper
    为提供的Unicode范围返回形状器。
    int
    返回此形状器的哈希码。
    boolean
    返回一个boolean,指示此形状器是否进行上下文形状。
    void
    shape(char[] text, int start, int count)
    转换在开始和开始+计数之间出现的文本中的数字。
    void
    shape(char[] text, int start, int count, int context)
    转换在开始和开始+计数之间出现的文本中的数字,使用提供的上下文。
    void
    shape(char[] text, int start, int count, NumericShaper.Range context)
    使用提供的上下文,转换在 startstart + count之间出现的文本中的数字。
    返回描述此形状器的String

    Methods declared in class java.lang.Object

    clone, finalize, getClass, notify, notifyAll, wait, wait, wait
  • Field Details

    • EUROPEAN

      public static final int EUROPEAN
      标识拉丁-1(欧洲)和扩展范围,以及拉丁-1(欧洲)十进制基数。
      参见:
    • ARABIC

      public static final int ARABIC
      标识阿拉伯范围和十进制基数。
      参见:
    • EASTERN_ARABIC

      public static final int EASTERN_ARABIC
      标识阿拉伯范围和扩展的阿拉伯十进制基数。
      参见:
    • DEVANAGARI

      public static final int DEVANAGARI
      标识梵文范围和十进制基数。
      参见:
    • BENGALI

      public static final int BENGALI
      标识孟加拉范围和十进制基数。
      参见:
    • GURMUKHI

      public static final int GURMUKHI
      标识果鲁穆奇范围和十进制基数。
      参见:
    • GUJARATI

      public static final int GUJARATI
      标识古吉拉特范围和十进制基数。
      参见:
    • ORIYA

      public static final int ORIYA
      标识奥里亚范围和十进制基数。
      参见:
    • TAMIL

      public static final int TAMIL
      标识泰米尔范围和十进制基数。
      参见:
    • TELUGU

      public static final int TELUGU
      标识泰卢固范围和十进制基数。
      参见:
    • KANNADA

      public static final int KANNADA
      标识卡纳达范围和十进制基数。
      参见:
    • MALAYALAM

      public static final int MALAYALAM
      标识马拉雅拉姆范围和十进制基数。
      参见:
    • THAI

      public static final int THAI
      标识泰语范围和十进制基数。
      参见:
    • LAO

      public static final int LAO
      标识老挝范围和十进制基数。
      参见:
    • TIBETAN

      public static final int TIBETAN
      标识藏文范围和十进制基数。
      参见:
    • MYANMAR

      public static final int MYANMAR
      标识缅甸范围和十进制基数。
      参见:
    • ETHIOPIC

      public static final int ETHIOPIC
      标识埃塞俄比亚范围和十进制基数。
      参见:
    • KHMER

      public static final int KHMER
      标识高棉范围和十进制基数。
      参见:
    • MONGOLIAN

      public static final int MONGOLIAN
      标识蒙古范围和十进制基数。
      参见:
    • ALL_RANGES

      public static final int ALL_RANGES
      标识所有范围,用于完整的上下文形状。

      此常量指定所有基于位掩码的范围。使用EnumSet.allOf(NumericShaper.Range.class)指定所有基于枚举的范围。

      参见:
  • Method Details

    • getShaper

      public static NumericShaper getShaper(int singleRange)
      返回提供的Unicode范围的形状器。所有拉丁-1(欧洲)数字将转换为相应的十进制Unicode数字。
      参数:
      singleRange - 指定的Unicode范围
      返回:
      一个非上下文数字形状器
      抛出:
      IllegalArgumentException - 如果范围不是单一范围
    • getShaper

      public static NumericShaper getShaper(NumericShaper.Range singleRange)
      返回提供的Unicode范围的形状器。所有拉丁-1(欧洲)数字将转换为指定Unicode范围的相应十进制数字。
      参数:
      singleRange - 由NumericShaper.Range常量给定的Unicode范围。
      返回:
      一个非上下文NumericShaper
      抛出:
      NullPointerException - 如果singleRangenull
      自:
      1.7
    • getContextualShaper

      public static NumericShaper getContextualShaper(int ranges)
      返回提供的Unicode范围的上下文形状器。如果范围是提供的范围之一,则拉丁-1(欧洲)数字将转换为前文文本范围对应的十进制数字。多个范围通过或值在一起表示,例如,NumericShaper.ARABIC | NumericShaper.THAI。该形状器假定欧洲作为起始上下文,也就是说,如果在字符串中遇到强方向文本之前遇到欧洲数字,则假定上下文为欧洲,因此数字不会形状。
      参数:
      ranges - 指定的Unicode范围
      返回:
      指定范围的形状器
    • getContextualShaper

      public static NumericShaper getContextualShaper(Set<NumericShaper.Range> ranges)
      返回提供的Unicode范围的上下文形状器。如果范围是提供的范围之一,则拉丁-1(欧洲)数字将转换为前文文本范围对应的十进制数字。

      该形状器假定欧洲作为起始上下文,也就是说,如果在字符串中遇到强方向文本之前遇到欧洲数字,则假定上下文为欧洲,因此数字不会形状。

      参数:
      ranges - 指定的Unicode范围
      返回:
      指定范围的上下文形状器
      抛出:
      NullPointerException - 如果rangesnull
      自:
      1.7
    • getContextualShaper

      public static NumericShaper getContextualShaper(int ranges, int defaultContext)
      返回提供的Unicode范围的上下文形状器。如果范围是提供的范围之一,则拉丁-1(欧洲)数字将转换为前文文本范围对应的十进制数字。多个范围通过或值在一起表示,例如,NumericShaper.ARABIC | NumericShaper.THAI。该形状器使用defaultContext作为起始上下文。
      参数:
      ranges - 指定的Unicode范围
      defaultContext - 起始上下文,例如NumericShaper.EUROPEAN
      返回:
      指定Unicode范围的形状器。
      抛出:
      IllegalArgumentException - 如果指定的defaultContext不是单一有效范围。
    • getContextualShaper

      public static NumericShaper getContextualShaper(Set<NumericShaper.Range> ranges, NumericShaper.Range defaultContext)
      返回提供的Unicode范围的上下文形状器。如果范围是提供的范围之一,则拉丁-1(欧洲)数字将转换为前文文本范围对应的十进制数字。该形状器使用defaultContext作为起始上下文。
      参数:
      ranges - 指定的Unicode范围
      defaultContext - 起始上下文,例如NumericShaper.Range.EUROPEAN
      返回:
      指定Unicode范围的上下文形状器。
      抛出:
      NullPointerException - 如果rangesdefaultContextnull
      自:
      1.7
    • shape

      public void shape(char[] text, int start, int count)
      转换在start和start + count之间出现的文本中的数字。
      参数:
      text - 要转换的字符数组
      start - 开始转换的text中的索引
      count - 要转换的text中的字符数
      抛出:
      IndexOutOfBoundsException - 如果start或start + count超出范围
      NullPointerException - 如果text为null
    • shape

      public void shape(char[] text, int start, int count, int context)
      转换在start和start + count之间出现的文本中的数字,使用提供的上下文。如果形状器不是上下文形状器,则忽略上下文。
      参数:
      text - 字符数组
      start - 开始转换的text中的索引
      count - 要转换的text中的字符数
      context - 要将字符转换为的上下文,例如NumericShaper.EUROPEAN
      抛出:
      IndexOutOfBoundsException - 如果start或start + count超出范围
      NullPointerException - 如果text为null
      IllegalArgumentException - 如果这是上下文形状器且指定的context不是单一有效范围。
    • shape

      public void shape(char[] text, int start, int count, NumericShaper.Range context)
      转换在startstart + count之间出现的文本中的数字,使用提供的context。如果形状器不是上下文形状器,则忽略context
      参数:
      text - 一个char数组
      start - 开始转换的text中的索引
      count - 要转换的text中的char
      context - 要将字符转换为的上下文,例如NumericShaper.Range.EUROPEAN
      抛出:
      IndexOutOfBoundsException - 如果startstart + count超出范围
      NullPointerException - 如果textcontext为null
      自:
      1.7
    • isContextual

      public boolean isContextual()
      返回一个boolean,指示此形状器是否进行上下文形状。
      返回:
      如果此形状器是上下文形状器,则为true;否则为false
    • getRanges

      public int getRanges()
      返回一个int,将所有将被塑形的范围的值进行按位或操作。

      例如,要检查一个塑形器是否塑形为阿拉伯语,您可以使用以下代码:

      if ((shaper.getRanges() & shaper.ARABIC) != 0) &#123; ...

      请注意,此方法仅支持基于位掩码的范围。对于基于枚举的范围,请调用getRangeSet()

      返回:
      所有将被塑形的范围的值。
    • getRangeSet

      public Set<NumericShaper.Range> getRangeSet()
      返回一个表示将被塑形的所有Unicode范围的Set
      返回:
      所有将被塑形的Unicode范围。
      自:
      1.7
    • hashCode

      public int hashCode()
      返回此塑形器的哈希码。
      覆盖:
      hashCode 在类 Object
      返回:
      此塑形器的哈希码。
      另请参阅:
    • equals

      public boolean equals(Object o)
      如果指定的对象是NumericShaper的实例,并且与此对象形状相同,无论范围表示、位掩码还是枚举如何,返回true。例如,以下代码将产生"true"
       NumericShaper ns1 = NumericShaper.getShaper(NumericShaper.ARABIC);
       NumericShaper ns2 = NumericShaper.getShaper(NumericShaper.Range.ARABIC);
       System.out.println(ns1.equals(ns2));
       
      覆盖:
      equals 在类 Object
      参数:
      o - 要与此NumericShaper进行比较的指定对象
      返回:
      如果oNumericShaper的实例并且形状相同,则返回true;否则返回false
      另请参阅:
    • toString

      public String toString()
      返回描述此塑形器的String。此方法仅用于调试目的。
      覆盖:
      toString 在类 Object
      返回:
      描述此塑形器的String