Unipre中的CJK(和CJKV)是指汉字表意文字,即在中文,日文,韩文和越南文中使用的汉字(汉字)。对于Unipre的脚本命名,但它 不是
指像日本平假名和片假名或韩文拼音编写的脚本。据说汉族思想图是统一的。意思是说,无论使用哪种表意符号,每个表意文字都只有一个Unipre代码点。
这意味着Unipre(以及相反的Android /
Java)无法提供仅基于单个表意文字来确定语言的方法。即使是中文简体/繁体字符也很难与编码区分开。这与无法知道字符“
a”是英语,法语还是西班牙语的想法相同。需要更多的上下文来确定这一点。
但是,您可以使用Unipre编码来确定日语的平假名/片假名和朝鲜语的韩文。这些字符的出现将很好地表明附近的汉代表意文字属于同一语言。
安卓系统您可以在某些索引处找到代码点
int prepoint = Character.prePointAt(myString, offset)
如果您想遍历字符串中的代码点,请执行以下 *** 作:
final int length = myString.length();for (int offset = 0; offset < length; ) { final int prepoint = Character.prePointAt(myString, offset); // use prepoint here offset += Character.charCount(prepoint);}
一旦有了代码点,就可以查找它所在的代码块
Character.UnipreBlock block = Character.UnipreBlock.of(prepoint);
然后,您可以使用代码块测试表意文字或语言。
中日韩
扫描Unipre代码块,我认为它们涵盖了所有CJK表意文字。如果我错过了任何内容,请随时编辑我的答案或发表评论。
private boolean isCJK(int prepoint) { Character.UnipreBlock block = Character.UnipreBlock.of(prepoint); return ( Character.UnipreBlock.CJK_UNIFIED_IDEOGRAPHS.equals(block)|| Character.UnipreBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A.equals(block) || Character.UnipreBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_B.equals(block) || Character.UnipreBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_C.equals(block) || // api 19 Character.UnipreBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_D.equals(block) || // api 19 Character.UnipreBlock.CJK_COMPATIBILITY.equals(block) || Character.UnipreBlock.CJK_COMPATIBILITY_FORMS.equals(block) || Character.UnipreBlock.CJK_COMPATIBILITY_IDEOGRAPHS.equals(block) || Character.UnipreBlock.CJK_COMPATIBILITY_IDEOGRAPHS_SUPPLEMENT.equals(block) || Character.UnipreBlock.CJK_RADICALS_SUPPLEMENT.equals(block) || Character.UnipreBlock.CJK_STROKES.equals(block) || // api 19 Character.UnipreBlock.CJK_SYMBOLS_AND_PUNCTUATION.equals(block) || Character.UnipreBlock.ENCLOSED_CJK_LETTERS_AND_MONTHS.equals(block) || Character.UnipreBlock.ENCLOSED_IDEOGRAPHIC_SUPPLEMENT.equals(block) || // api 19 Character.UnipreBlock.KANGXI_RADICALS.equals(block) || Character.UnipreBlock.IDEOGRAPHIC_DEscriptION_CHARACTERS.equals(block));}
带有注释的注释(向右滚动)仅在API级别19中可用。但是,如果您需要支持较早的版本,则可能会安全地删除这些注释,因为它们很少使用。同样,Unipre定义了CJK扩展E,但是在撰写本文时,Android
/
Java不支持它。如果您确实需要包括所有内容,则可以直接将代码点与Unipre块范围进行比较。该站点是浏览它们的便捷位置。您也可以在Unipre站点上看到它们。
如果您不需要在API 19以下支持,则
isIdeographic可以使测试非常容易(尽管我不知道它是否返回与上述方法完全相同的匹配项)。
private boolean isCJK(int prepoint) { return Character.isIdeographic(prepoint);}
或适用于API 24+的版本:
private boolean isCJK(int prepoint) { return (Character.Uniprescript.of(prepoint) == Character.Uniprescript.HAN);}
日本
对于测试平假名或片假名,这应该可以正常工作:
private boolean isJapaneseKana(int prepoint) { Character.UnipreBlock block = Character.UnipreBlock.of(prepoint); return ( Character.UnipreBlock.HIRAGANA.equals(block) || Character.UnipreBlock.KATAKANA.equals(block) || Character.UnipreBlock.KATAKANA_PHONETIC_EXTENSIONS.equals(block));}
如果您支持API 24+,则为:
(这需要更多测试。请参见下面的评论。)
private boolean isJapaneseKana(int prepoint) { return (Character.Uniprescript.of(prepoint) == Character.Uniprescript.HIRAGANA || Character.Uniprescript.of(prepoint) == Character.Uniprescript.KATAKANA);}
韩语
要在较低的API上测试Hangul,可以使用
private boolean isKoreanHangul(int prepoint) { Character.UnipreBlock block = Character.UnipreBlock.of(prepoint); return (Character.UnipreBlock.HANGUL_JAMO.equals(block) || Character.UnipreBlock.HANGUL_JAMO_EXTENDED_A.equals(block) || // api 19 Character.UnipreBlock.HANGUL_JAMO_EXTENDED_B.equals(block) || // api 19 Character.UnipreBlock.HANGUL_COMPATIBILITY_JAMO.equals(block) || Character.UnipreBlock.HANGUL_SYLLABLES.equals(block));}
如有必要,请删除标有API 19的行。
或对于API 24+:
进一步研究private boolean isKoreanHangul(int prepoint) { return (Character.Uniprescript.of(prepoint) == Character.Uniprescript.HANGUL);}
- Unipre东亚文字
- Unipre CJK常见问题解答
- Unipre韩文常见问题解答
- 一些源代码显示如何
Character.Uniprescript
工作 - 中日韩统一表意文字
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)