gpt4 book ai didi

java - Unicode 日文延长的声音标记被排除在假名脚本之外?

转载 作者:行者123 更新时间:2023-11-30 08:50:59 31 4
gpt4 key购买 nike

我正在尝试通过删除特殊字符来清理字符串以生成 slug。也就是说,我想保留 CJK 字符,否则这些语言将一无所有。

所以我有一个正则表达式,它应该通过列出脚本来保留 CJK 字符:

"[^-_.\\w-\\p{script=Han}\\p{script=Hira}\\p{script=Kana}\\p{script=Hang}]"

问题是,片假名长音标记“ー”似乎被排除了。

http://www.unicodemap.org/details/0x30FC/index.html

这是显示问题的代码:

https://github.com/erwan/unicode-java-issue/blob/master/src/main/java/com/example/Hello.java

我列出的脚本中没有吗?

编辑:好的,如果您愿意,可以在此处编码,但它所提供的信息并不比正则表达式本身多得多。它非常有用,因此人们可以尝试。

package com.example;

class Hello {
public static void main(String[] args) {
String input = "%;アレルギー[]abcd";
String output= input.replaceAll("[^-_.\\w-\\p{script=Han}\\p{script=Hira}\\p{script=Kana}\\p{script=Hang}]", "");
System.out.println(output);
}
}

最佳答案

不,事实上,它不在列出的脚本中。 Unicode Standard将此字符放在 Common 脚本中。

应该区分 Unicode 中的“脚本”和“ block ”。该字符属于片假名 block ,还有其他一些不是字母的字符,例如“片假名迭代标记”(\u30fd)。但它不属于片假名脚本。只有实际音节属于片假名脚本。

您可以做的一件事是将 script 指示替换为 katakanablock:

output = input.replaceAll("[^-_.\\w-\\p{script=Han}\\p{script=Hira}\\p{block=Katakana}\\p{script=Hang}]", "");

这种情况下的输出将包括延长的声音标记。

或者你可以这样做:

Matcher m = Pattern.compile("[^-_.\\w]",Pattern.UNICODE_CHARACTER_CLASS).matcher(input);
output = m.replaceAll("");

此模式将匹配所有语言的所有单词字符,包括但不限于日语。

对于输入字符串"%;アレルギー[]{}=abceⸯd汉字ру́сский",这将产生

アレルギーabceⸯd漢字ру́сский

而我的第一个建议,带有 block 的那个,输出将是:

アレルギーabced漢字

因此,如果您只想限制为日语(和韩语),我的第一个建议可能更适合您,而如果您想要所有国际单词字符,第二个会更好。

关于java - Unicode 日文延长的声音标记被排除在假名脚本之外?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30735835/

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