替换Java 6中的Normalizer.getClass(c)方法

Normalizer类中的getClass(char c)方法似乎从Java 6开始就缺少。

这种方法存在于我们的遗留代码中,正在使用,如下所示。 我们需要将它迁移到Java 6.关于如何替换它的任何建议?

import sun.text.Normalizer;

 /**
 * Returns an array of strings that have all the possible
 * permutations of the characters in the input string.
 * This is used to get a list of all possible orderings
 * of a set of combining marks. Note that some of the permutations
 * are invalid because of combining class collisions, and these
 * possibilities must be removed because they are not canonically
 * equivalent.
 */
private String[] producePermutations(String input) {
    if (input.length() == 1)
        return new String[] {input};

    if (input.length() == 2) {
        if (getClass(input.charAt(1)) ==
            getClass(input.charAt(0))) {
            return new String[] {input};
        }
        String[] result = new String[2];
        result[0] = input;
        StringBuffer sb = new StringBuffer(2);
        sb.append(input.charAt(1));
        sb.append(input.charAt(0));
        result[1] = sb.toString();
        return result;
    }

    int length = 1;
    for(int x=1; x<input.length(); x++)
        length = length * (x+1);

    String[] temp = new String[length];

    int combClass[] = new int[input.length()];
    for(int x=0; x<input.length(); x++)
        combClass[x] = getClass(input.charAt(x));

    // For each char, take it out and add the permutations
    // of the remaining chars
    int index = 0;
loop:   for(int x=0; x<input.length(); x++) {
        boolean skip = false;
        for(int y=x-1; y>=0; y--) {
            if (combClass[y] == combClass[x]) {
                continue loop;
            }
        }
        StringBuffer sb = new StringBuffer(input);
        String otherChars = sb.delete(x, x+1).toString();
        String[] subResult = producePermutations(otherChars);

        String prefix = input.substring(x, x+1);
        for(int y=0; y<subResult.length; y++)
            temp[index++] =  prefix + subResult[y];
    }
    String[] result = new String[index];
    for (int x=0; x<index; x++)
        result[x] = temp[x];
    return result;
}

private int getClass(char c) {
    return Normalizer.getClass(c);
}

来自java.textNormalizersun.textNormalizer没有相同的功能

只根据你输入的这段代码,简单的做你想做的就是使用ICU4J依赖。 如果你使用maven,像这样:

<dependency>
    <groupId>com.ibm.icu</groupId>
    <artifactId>icu4j</artifactId>
    <version>4.6</version>
</dependency>

然后,你可以写一个这样的类:

package com.ibm.icu.text;

public class Normalizer {

    public static final int getClass(final char ch) {
        final int value = DecompData.canonClass.elementAt(ch);
        return value >= 0 ? value : value + 256;
    }

}

由于DecompData具有包隐私可见性,因此在应用程序中的相同包中创建Normalizer


在Java 6中,该方法已重命名为getCharacterClass ,并且参数已从char更改为int ,因为这种替换在各处均已完成,以适应值大于65,535的Unicode字符。

从一开始使用sun的软件包中的方法不应该首先被使用。 这可能是为什么这个调用是在一个单独的方法中,以防万一在方法被删除的时候需要重写。 不幸的是,我无法在公共Java API中找到相应的替代品,因此替代品必须从头开始编写或无证。


正如其他人指出的,你的代码片段是sun.text.Normalizer而不是java.text.Normalizer 。 在Java 6我看到sun.text.Normalizer有一个称为方法getCombiningClass(int ch)其被描述尽管采取的是“返回合成类给定字符的” int ,而不是一个char 。 这可能是你正在寻找的方法。

我应该注意到,作为一个sun.*类,这些类型的方法在不知情的情况下会受到这些变化(重命名,消失),您使用它们需要您自担风险。 警告编码器!

链接地址: http://www.djcxy.com/p/83179.html

上一篇: Replacement for Normalizer.getClass(c) method in Java 6

下一篇: Which version of VB is used in SSRS