这个规范化功能如何工作?

时间:2009-08-14 20:04:41

标签: java

我正在做一个Junit教程,我遇到了正在测试的这个规范化函数。它定义如下:

 public static String normalizeWord(String word) {
        try {
            int i;
            Class<?> normalizerClass = Class.forName("java.text.Normalizer");
            Class<?> normalizerFormClass = null;
            Class<?>[] nestedClasses = normalizerClass.getDeclaredClasses();
            for (i = 0; i < nestedClasses.length; i++) {
                Class<?> nestedClass = nestedClasses[i];
                if (nestedClass.getName().equals("java.text.Normalizer$Form")) {
                    normalizerFormClass = nestedClass;
                }
            }
            assert normalizerFormClass.isEnum();
            Method methodNormalize = normalizerClass.getDeclaredMethod(
                                                            "normalize",
                                                            CharSequence.class,
                                                            normalizerFormClass);
            Object nfcNormalization = null;
            Object[] constants = normalizerFormClass.getEnumConstants();
            for (i = 0; i < constants.length; i++) {
                Object constant = constants[i];
                if (constant.toString().equals("NFC")) {
                    nfcNormalization = constant;
                }
            }
            return (String) methodNormalize.invoke(null, word, nfcNormalization);
        } catch (Exception ex) {
            return null;
        }
    }

这个功能如何运作?它到底在做什么?

3 个答案:

答案 0 :(得分:5)

它与:

相同
import java.text.Normalizer;

try {
    return Normalizer.normalize(word, Normalizer.Form.NFC);
} catch (Exception ex) {
    return null;
}

除了通过反射执行所有操作。

答案 1 :(得分:3)

使用反射调用

java.text.Normalizer.normalize(word, java.text.Normalizer.Form.NFC);

据推测,允许它在1.6之前的Java版本上运行,而这些版本没有这个类。

答案 2 :(得分:2)

此函数提供有关Unicode字符串规范化的服务。 在Unicode中,您可以通过多种方式表示相同的内容。例如,你有一个带重音的角色。您可以使用一个Unicode字符表示已连接,或已分解(原始字母,不带重音符号,然后是修饰符 - 重音符号)。

该类来自Java 6.对于Java 5,有一个SUN专有类。

请参阅Phramer项目中的类info.olteanu.utils.TextNormalizerhttp://sourceforge.net/projects/phramer/,www.phramer.org),了解在Java 5(SUN JDK)和Java 6中获取规范化器的方法,没有任何编译问题(代码将在任何版本&gt; = 5中编译,代码将在两个JVM中运行,尽管SUN放弃了Java 5专有类。)