日语“半语音”字符的转换

问题描述

我正在尝试比较两个包含日语字符的spark数据帧,其中有些字符看起来与程序相同但实际上不同,例如プvsプ

如果将它们放在utf-8编码器中:

プutf-8 = \ xE3 \ x83 \ x97

プutf-8 = \ xE3 \ x83 \ x95 \ xE3 \ x82 \ x9A

看起来像フ(\ xE3 \ x83 \ x95)+小圆圈半语音符号(\ xE3 \ x83 \ x95)=プ

这些区别叫什么,在Java / Scala中有什么方法可以在它们之间转换?

谢谢。

解决方法

又名\xE3\x83\x97 (UTF-8)\u30d7又名'KATAKANA LETTER PU' (U+30D7)

プ又名\xE3\x83\x95\xE3\x82\x9A (UTF-8)\u30d5\u309a又名'KATAKANA LETTER HU' (U+30D5)'COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK' (U+309A)

如您所见,第二个字符是基本字符和组合字符。这类似于对拉丁字符(例如, ñ = n + ̃ 又名\u00f1 = \u006e + \u0303

您可以使用Normalizer类在两种形式之间进行转换。参见:javadoc

另请参阅:The Java™ Tutorials - Normalizing Text
另请参阅:Combining accent and character into one character in java 7