gpt4 book ai didi

java - 如何获取Unicode字符的基址指针?

转载 作者:行者123 更新时间:2023-11-30 06:31:48 24 4
gpt4 key购买 nike

目前我有“codePointAt”,它返回字符串中字符的代码点。有没有API或其他方法可以获取当前字符的基指针?

public class Testclass {

public static void main(String[] args) {

String unicodeString = "कागज़";
int currentPoint = unicodeString.codePointAt(0);

// Now currentPoint = 0x0915
// I need currentPoint = 0x0900
}
}

注意# 我无法通过加法/减法创建基指针,因为不同语言的基点从不同的个位/十位值开始。例如

亚美尼亚语 - 0530-058F - 基址指针 0x0530(十位值)
天城文 - 0900-097F - 基址指针 0x0900(百位值)

目前,我正在使用 if-else block 来获取基指针,这种方法不是动态的,而且方法也很冗长。 :-(

int basePointer;
if(currentPoint>0x600 && currentPoint<=0x6FF)//Means Arabic
{
basePointer = 0x0600;
}
if(currentPoint>0x900 && currentPoint<=0x97F)//Means Devnagri
{
basePointer = 0x0900;
}

最佳答案

好的,经过一番思考后,这里有一种仅使用 Java API 即可实现的方法。它由三部分组成:

  1. 重新生成无法访问的 block 基表 blockStartsCharacter.UnicodeBlock进入 map
  2. 使用 Character.UnicodeBlock.of(int)查找给定代码点的 block 名称
  3. 使用Map根据给定的 block 名称查找 Unicode block 基

请注意,在我的机器上重新生成 block 基表相对较慢,大约需要 10-15 毫秒,因此最好生成一次并重复使用。我已经保留了基本的计时代码。

private static final int SUPPLEMENTARY_PRIVATE_USE_AREA_A_BASE = 0x0F0000;
private static final int SUPPLEMENTARY_PRIVATE_USE_AREA_B_BASE = 0x100000;

private static final Character.UnicodeBlock SUPPLEMENTARY_PRIVATE_USE_AREA_A =
Character.UnicodeBlock.of(SUPPLEMENTARY_PRIVATE_USE_AREA_A_BASE);
private static final Character.UnicodeBlock SUPPLEMENTARY_PRIVATE_USE_AREA_B =
Character.UnicodeBlock.of(SUPPLEMENTARY_PRIVATE_USE_AREA_B_BASE);

public static Map<Character.UnicodeBlock, Integer> makeUnicodeBlockBaseMap() {
long startNanos = System.nanoTime();
Map<Character.UnicodeBlock, Integer> unicodeBases = new HashMap<>();
// Unicode blocks start on 16 (0x10) byte boundaries.
for (int cp = 0x00000; cp < SUPPLEMENTARY_PRIVATE_USE_AREA_A_BASE; cp += 0x10) {
Character.UnicodeBlock ucb = Character.UnicodeBlock.of(cp);
if (ucb != null) {
unicodeBases.putIfAbsent(ucb, cp);
}
}
// These blocks are huge, so add them manually.
unicodeBases.put(SUPPLEMENTARY_PRIVATE_USE_AREA_A, SUPPLEMENTARY_PRIVATE_USE_AREA_A_BASE);
unicodeBases.put(SUPPLEMENTARY_PRIVATE_USE_AREA_B, SUPPLEMENTARY_PRIVATE_USE_AREA_B_BASE);
long endNanos = System.nanoTime();
System.out.format("Total time = %.3f s%n", (endNanos - startNanos) / 1e9);
return unicodeBases;
}

public static void main(String[] args) {
Map<Character.UnicodeBlock, Integer> unicodeBlockBases = makeUnicodeBlockBaseMap();

String unicodeString = "कागज़";
int currentPoint = unicodeString.codePointAt(0);

Character.UnicodeBlock ucb = Character.UnicodeBlock.of(currentPoint);
System.out.println(ucb); // DEVANAGARI
System.out.format("0x%04X%n", unicodeBlockBases.get(ucb)); // 0x0900
}

关于java - 如何获取Unicode字符的基址指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45931128/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com