【发布时间】:2019-03-07 01:21:51
【问题描述】:
我正在努力支持系统中的 unicode 字符,因此我想将字符拆分为包含泰米尔语字母的字符串。我不知道在 Java 中处理英语以外的字符串。
String word = new String("தமிழ்")
String[] chars = word.split("")
输出了什么
[த, ம, ி, ழ, ்]
预期结果
[த, மி, ழ்]
【问题讨论】:
标签: java unicode-string
我正在努力支持系统中的 unicode 字符,因此我想将字符拆分为包含泰米尔语字母的字符串。我不知道在 Java 中处理英语以外的字符串。
String word = new String("தமிழ்")
String[] chars = word.split("")
[த, ம, ி, ழ, ்]
[த, மி, ழ்]
【问题讨论】:
标签: java unicode-string
分配给“word”的字符串实际上是 5 个 Unicode 字符。第三个字符,例如 (U+0BFF) 与前一个字符 (U+0BAE?) 组合成一个显示符号。
由于您将单词拆分为字符,因此您将得到 5 个字符。没有像(例如)原始字符串中显示的中间符号这样的单个字符。
由于组合字符,屏幕上显示的符号数量不一定与 Unicode 字符的数量相同。一般来说,呈现 Unicode 字符串的程序必须能够识别字符的组合。
有关 Unicode 中泰米尔语的问题,请参阅 this document。图 12-21 讨论了 i 元音,它是 5 的中间字符。
目前尚不清楚您拆分字符串的目的。如果您真的想要“表观符号”(我正在编造这个术语),那么您可能需要扫描生成的字符以查找组合字符。
This document 描述了一种似乎对您有用的方法,尽管该页面说 JDK 8 之后的版本中有更好的工具,我没有花时间去寻找。不过,这可能会更彻底地说明正在发生的事情。
【讨论】:
split 处理 Unicode 字符,而不是我笨拙地称为“表观符号”的东西。您可以编写一个更复杂的正则表达式来处理 字符单元后跟一些组合字符,但这不是split 的使用,BreakIterator 解决方案看起来更有吸引力我。
(?U)(?!\p{Mc}) 上拆分,但我对此没有信心,尤其是 Mc 部分。您可能还必须先设置语言环境。