【问题标题】:How does this normalize function work?这个归一化函数是如何工作的?
【发布时间】:2010-11-19 18:39:09
【问题描述】:

我正在做一个 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;
        }
    }

这个功能是如何工作的?它实际上在做什么?

【问题讨论】:

    标签: java


    【解决方案1】:

    与以下内容相同:

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

    除了所有的操作都是通过反射来执行的。

    【讨论】:

    • 除非你真的需要在 pre-Java6 上编译(而不是仅仅运行),否则它应该这样写。如果您也捕获所有异常(可能还有一些与类加载相关的错误),那么此代码甚至会在不存在 Normalizer 类的 JDK5 上优雅地降级。不过,您将需要在 Java6 上进行编译。 (使用反射版本,您也可以在较旧的 Java 上编译,尽管可能会说您实际上并没有编译任何东西,那里有所有反射)。
    【解决方案2】:

    它使用反射来调用

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

    大概是为了让它在没有这个类的 1.6 之前的 Java 版本上运行。

    【讨论】:

      【解决方案3】:

      此函数提供有关 Unicode 字符串规范化的服务。 在 Unicode 中,您可以用多种方式表示同一事物。例如,您有一个带有重音的字符。您可以使用单个 Unicode 字符将其表示为连接,或分解(原始字母,没有重音符号,然后是修饰符 - 重音符号)。

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

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

      【讨论】:

        猜你喜欢
        • 2016-11-01
        • 2011-03-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-14
        • 1970-01-01
        • 1970-01-01
        • 2013-03-20
        相关资源
        最近更新 更多