如何将组合变音符号转换为单个字素

时间:2018-01-30 13:48:12

标签: html unicode

我有一份PDF文档,其中包含我要复制并粘贴到HTML文档中的文字。

问题是所有重音字符实际上都是combining diacritical marks而不是single Unicode code points

因此,例如,é由Unicode点é表示,此处编码为两个单独的字符,如ée& ́ )。

这不是很容易处理,特别是因为某些浏览器(Firefox)在重音字母后显示空格而其他一些(Chrome)则没有。

因此,有没有办法自动将那些讨厌的字符转换为友好的单个Unicode代码点字符?

2 个答案:

答案 0 :(得分:2)

您希望将normalize字符串添加到组合形式之一,即NFC或NFKC(区别在于NFKC会删除一些格式区别,例如连字)。

我不确定你的意思是'自动',但我相信大多数语言都可以,例如:

  • Python:unicodedata.normalize()

    import unicodedata
    original_string = '\u0065\u0301'
    normalized_string = unicodedata.normalize('NFC', original_string)
    
  • Java / Android:Normalizer.normalize()

    String normalizedText = Normalizer.normalize(originalString, Normalizer.Form.NFC)
    
  • .Net:String.Normalize()

    string normalizedText = originalString.Normalize(NormalizationForm.FormC);
    
  • Oracle SQL COMPOSE()

    SELECT COMPOSE(UNISTR('\0065\0301')) FROM DUAL;
    

在线测试:Dencode(NFD和NFKD称为解码NFC 解码NFKC

答案 1 :(得分:0)

如果您使用的是Linux,则可以使用uconv从一种Unicode格式转换为另一种Unicode格式。

要将文本文件从UTF-8 NFD转换为UTF-8 NFC:

uconv -f utf8 -t utf8 -x NFC $in_file -o $out_file

由于您提到了复制/粘贴,因此也可以直接使用别名来完成。假设您的Linux默认使用UTF-8:

alias to_nfc='xclip -o -selection clipboard | uconv -f - -x NFC | xclip -selection clipboard'

然后,您只需在终端中输入to_nfc即可转换剪贴板。

在基于Debian的系统(Ubuntu等)上,uconv位于软件包icu-devtools中:

sudo apt install icu-devtools

在Centos上:yum install icu

在Mac(或Windows(如果已安装Perl)上)上,您可以尝试

perl -C -MUnicode::Normalize -pe '$_=NFC($_)' < $in_file > $out_file