Java API获取特定脚本的CodePoints列表?

时间:2015-09-13 20:01:23

标签: java unicode utf-8

我正在尝试生成一个文档(电子表格,无论如何),它显示特定机器上的哪些字体支持特定脚本中的特定字形:所以我可以机器检查特定字体是否适合呈现特定脚本或不

在给定特定“脚本”的情况下,是否存在将返回完整字符列表的Java API;说'拉丁','希腊','平假名'等?

以下代码将输出特定脚本的已定义字符的完整列表。

例如希腊语。

import java.io.IOException;
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.List;

public class CharacterTest {

    public static List<char[]> getListofCharacters(String StartCode, String EndCode) {
        List<char[]> characters = new ArrayList<>();
        int start = Integer.parseInt(StartCode, 16);
        int end = Integer.parseInt(EndCode, 16);

        for (int i = start; i <= end; i++) {
            if (java.lang.Character.isDefined(i)) {
                char[] c = java.lang.Character.toChars(i);
                characters.add(c);
            }
        }
        return characters;
    }

    public static void main(String[] args) throws IOException {
        List<char[]> GreekCharacters = getListofCharacters("0370", "03FF");
        try (PrintStream out = new PrintStream("C:\\GREEK.TXT", "UTF-8")) {
            for (char[] ch : GreekCharacters) {
                out.println(String.valueOf(ch));
            }
            out.flush();
        }
    }
}

我从Unicode图表站点获得了开始/结束代码点: http://www.unicode.org/charts/

具体来自此PDF:http://www.unicode.org/charts/PDF/U0370.pdf

[顺便说一下,我不确定为什么API会提供'getChars'而不是'getChar' - 我对UTF-8的理解显然在这里缺乏:我原以为我会想到'char'会是曾经代表一个符号? (它本身当然可以由多个字节组成)...]

1 个答案:

答案 0 :(得分:2)

脚本连续范围,您的代码错过了several hundred希腊字符。如果您需要查询特定字符的脚本,请使用Character.UnicodeScript类 - 但如果确实需要完整列表,则需要阅读UCD data files或列举所有代码点:

import java.lang.Character;
import java.util.ArrayList;
import java.util.List;

List<Integer> code_points = new ArrayList<Integer>();
for (int cp = Character.MIN_CODE_POINT; cp < Character.MAX_CODE_POINT; ++cp) {
    if (Character.UnicodeScript.of(cp) == Character.UnicodeScript.GREEK) {
        code_points.add(cp);
    }
}