代码之家  ›  专栏  ›  技术社区  ›  Geo

如何检测Java字符串中的unicode字符?

  •  21
  • Geo  · 技术社区  · 15 年前

    例如,给定字符串“AX”,我想将其转换为“AYXY”。我想对其他unicode字符也这样做,我不想把它们存储在某种翻译映射中。

    6 回复  |  直到 15 年前
        1
  •  16
  •   jitter    15 年前

    您可以在字符串中循环,并为每个字符调用循环

    If (Character.UnicodeBlock.of(c) != Character.UnicodeBlock.BASIC_LATIN) {
     // replace with Y
    }
    
        2
  •  15
  •   Dave Jarvis James Eichele    8 年前

    ISO 8859 charset . 如果在您的情况下是这样,则循环遍历字符串中的所有字符并测试其代码点,以确定它是否在给定的字符集中。

    或者,使用 Map<Character, Character> 和映射中包含匹配键的字符。例如:

    Map<Character, Character> charReplacementMap = new HashMap<Character, Character>() {{
        put('Ü', 'Y');
        // Put more here.
    }};
    
    String originalString = "AÜAÜ";
    StringBuilder builder = new StringBuilder();
    
    for (char currentChar : originalString.toCharArray()) {
        Character replacementChar = charReplacementMap.get(currentChar);
        builder.append(replacementChar != null ? replacementChar : currentChar);
    }
    
    String newString = builder.toString();
    

    或者,你的意思是“所有带变音符号的字符”?如果是,则使用 java.text.Normalizer 要删除变音标记,请执行以下操作:

    /**
     * Remove any diacritical marks (accents like ç, ñ, é, etc) from
     * the given string (so that it returns plain c, n, e, etc).
     * @param string The string to remove diacritical marks from.
     * @return The string with removed diacritical marks, if any.
     */
    public static String removeDiacriticalMarks(String string) {
        return Normalizer.normalize(string, Form.NFD)
            .replaceAll("\\p{InCombiningDiacriticalMarks}+", "");
    }
    

    一个陷阱,1956;œ会变成U,而不是Y。不确定这是否是你想要的。如果要替换为发音字符,则确实需要创建映射。当然,这是一项乏味的工作,但它所用的时间比你理解这个主题所需的时间要短。

        3
  •  13
  •   msp albert muda    6 年前

    您可以反过来询问该字符是否为ascii字符。

    public static boolean isAscii(char ch) {
        return ch < 128;
    }
    

    当然,你必须逐字符分析字符串。

    commons-lang CharUtils 其中包含大量有用的字符方法)

        4
  •  2
  •   Community CDub    8 年前

    我不清楚将“AX”转换为“AYXY”究竟能得到什么。这是因为在一种特定的语言中发音像Y吗?什么语言?还有什么其他规则可以适用?


    "a"
    

    上面是一个Unicode字符串。它包含单个UTF-16编码字符。

    如果希望将字符范围限制为英文字母,请查看 Normalization performed in this answer .

        5
  •  1
  •   Dominic Rodger    15 年前

        6
  •  0
  •   Aliaxander    8 年前

    班级 Character 还提供了一些有趣的方法。看一看。

    Character.UnicodeBlock.of('a') == Character.UnicodeBlock.BASIC_LATIN; //true
    
    Character.UnicodeBlock.of('�') == Character.UnicodeBlock.BASIC_LATIN; //false