【问题标题】:Composing unicode characters in Java?用Java编写unicode字符?
【发布时间】:2012-06-15 21:31:35
【问题描述】:

我正在开发一个随机名称生成器,用于我正在开发的游戏中,问题是不同的物种具有不同的命名风格,我想要一个名称生成器来处理所有这些。我已经对这个问题的第一部分进行了排序 - 名称生成器使用一系列模板,每个种类的玩家/NPC 一组。

我遇到的主要问题是一些元音需要有一个随机选择的重音标记。我已经搜索和搜索,但我找不到随机选择一个字符然后对其应用重音符号的方法。那么,通过选择字母然后对其应用重音标记来组成重音字母的方法有哪些?

【问题讨论】:

  • 如果您知道应该用重音标记哪些元音,请制定一种方法来检查该元音的重音。例如,如果您有一个要应用重音符号的 a 字符,请使用 vowelsWithAccent.getAccent(a) 方法将其更改为 á。该方法可以使用Map<Character, Character> 为您提供带重音的元音。

标签: java unicode character-encoding


【解决方案1】:

Unicode 具有代表大多数重音类型的“组合”字符。从您创建的组合字符数组中随机选择一个组合字符非常容易。然后你可以把你喜欢的任何重音放在你喜欢的任何字符上。

http://en.wikipedia.org/wiki/Combining_character

由于这些由代码点表示,您可以将它们单独视为一个字符:

String s = "a" + "\u0300"; // latin lowercase letter a + combining grave accent
char combining_grave_accent = '\u0300';

【讨论】:

  • 不幸的是,Java 似乎没有一种 API 可以让人们拥有 String s = LATIN_LETTER_A | ACCENT_GRAVE 或类似的东西。
  • 所以可以用Java来完成,只需要知道组合字符的字符代码。这很棒,因为我可以添加重音符号,然后在名称生成的最后一步规范化字符串。
【解决方案2】:

嗯,也许使用二维数组并创建一个转换表,该表将有 2 列和多少行(有多少重音字符),现在在第一列存储每个重音值,在第二列存储值 un-accented 即 a,e,i,o,u 并且当您为名称生成元音时,您可以随机选择是否重音,如果您选择重音,您将遍历 2d 数组获取所有重音值使用“a”或其他任何内容,并通过获取和检查数组第二列中的值(以便选择所有重音 a),然后随机选择一个使用...

这是很长的路要走,我知道在 java 中没有捷径。

编辑: 这是一些符合我建议的代码:

import java.util.ArrayList;

/**
 *
 * @author David
 */
public class JavaApplication145 {

    static char[][] chars = new char[6][6];

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {

        createConversionTable();

        char c = 'u';

        ArrayList<String> charsList = getAccentedChar(c);

        for (int i = 0; i < charsList.size(); i++) {
            System.out.println(charsList.get(i));
        }

    }

    private static void createConversionTable() {
        chars[0] = new char[]{'ù', 'ü', 'é', 'ê', 'ä', 'à'};
        chars[1] = new char[]{'u', 'u', 'e', 'e', 'a', 'a'};
    }

    private static ArrayList getAccentedChar(char c) {

        ArrayList<String> charsList = new ArrayList<>();

        for (int i = 0; i < chars[0].length; i++) {

            for (int x = 0; x < chars[1].length; x++) {

                if (chars[i][x] == c) {
                    charsList.add(chars[i - 1][x] + "");
                }

            }
        }
        return charsList;
    }
}

【讨论】:

  • 与其使用 2 个数组,不如使用 Map(易于维护,访问速度更快)。不过,你的观点还是不错的。
  • 是的,这样会更有效率嘿?! +1 ... 好吧,希望 OP 明白并会这样做
  • 也许,也许不,我们不确定。不过,您应该查看Java Collections 并使用实际代码进行一些练习,以学习另一种方法来实现更可维护和更好性能的代码。正如我对你所说,至少有想法是好的,但在现实世界中,你需要的不仅仅是想法才能生存:)。
  • Java Collections 包含一些很棒的快速实用程序。
【解决方案3】:

需要同样的东西,所以我最终做了这个:

        /**
 * Given a letter and an accent, return the char with the accent included.
 * 
 * @param accentCode: The accent char; i.e '~', '´';
 * @param letter: Letter to put accent in it.
 * @return: Char with {@code letter} with accent if it was a valid letter.
 */
public static int getAccent(char accentChar, int letter) {
    int index = 0;
    boolean upperCase = false;
    for (char vogal : vogalList) {
        if (letter == vogal) {
            if (index >= 5) {
                index -= 5;
                upperCase = true;
            }
            for (int accentType = 0; accentType < convertTable.length; accentType++) {
                if (convertTable[accentType][0] == accentChar) {
                    char converted = convertTable[accentType][index + 1];
                    if (converted != '-') {
                        if (upperCase)
                            converted = Character.toUpperCase(converted);

                        return converted;
                    }
                }
            }
        }
        index++;
    }
    return letter;
}

/**
 * Verify if {@code charID} is an accent character;
 * 
 * @param charID: Character code id to be verified.
 * @return: true in case {@code charID} is an accent character id.
 */
public static boolean isAccent(int charID) {
    for (int i = 0; i < convertTable.length; i++) {
        if (convertTable[i][0] == charID)
            return true;
    }
    return false;
}

private static final char[] vogalList = { 'a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U' };
private static final char[][] convertTable = { { '´', 'á', 'é', 'í', 'ó', 'ú' }, { '`', 'à', 'è', 'ì', 'ò', 'ù' }, { '^', 'â', 'ê', 'î', 'ô', 'û' }, { '~', 'ã', '-', '-', 'õ', '-' }, { '¨', 'ä', 'ë', 'ï', 'ö', 'ü' } };

【讨论】:

    猜你喜欢
    • 2012-01-04
    • 2013-05-13
    • 2013-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-30
    相关资源
    最近更新 更多