从Java 6开始,似乎缺少Normalizer类的getClass(char c)
方法。
此方法存在于我们的遗留代码中,正在使用,如下所示。我们需要将它迁移到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);
}
答案 0 :(得分:2)
正如其他人所指出的,您的代码段是sun.text.Normalizer
而不是java.text.Normalizer
。在Java 6中,我看到sun.text.Normalizer
有一个名为getCombiningClass(int ch)
的方法,它被描述为&#34;返回给定字符的组合类&#34;尽管采用了int
而不是char
。这可能是您正在寻找的方法。
我应该注意到,作为一个sun.*
类,这些方法会受到这些变化(重命名,消失)而不会发出通知,您使用它们需要您自担风险。警告编码器!
答案 1 :(得分:2)
在Java 6中,该方法已重命名为getCharacterClass
,参数已从char
更改为int
,因为这种替换在任何地方都已完成,以适应Unicode字符值大于65,535。
首先应该使用以sun
开头的包中的方法。这可能是为什么调用是在一个单独的方法中,以防如果删除该方法需要重写。不幸的是,我无法在公共Java API中找到等价物,因此替换必须是从头开始编写或未记录。
答案 2 :(得分:1)
来自java.text
的规范化器与来自Normalizer
sun.text
具有相同的功能
仅根据您输入的这段代码,您可以轻松地使用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
。