【问题标题】:How to convert Combining Diacritical Marks to single grapheme如何将组合变音符号转换为单个字素
【发布时间】:2018-07-09 10:24:16
【问题描述】:

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

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

例如,将由 Unicode 点 é 表示的 é 在这里被编码为两个单独的字符,如 éé)。

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

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

【问题讨论】:

    标签: html unicode


    【解决方案1】:

    如果您使用的是 Linux,则可以使用 uconv 将一种 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
    

    【讨论】:

      【解决方案2】:

      您想将normalize 字符串转换为组合形式之一,NFC 或 NFKC(不同之处在于 NFKC 删除了一些格式区别,如连字)。

      我不确定你所说的“自动”到底是什么意思,但我相信大多数语言都是可能的,例如:

      • Python :unicodedata.normalize():

        import unicodedata
        original_string = '\u0065\u0301'
        normalized_string = unicodedata.normalize('NFC', original_string)
        
      • Java/安卓: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被称为Decoded NFCDecoded NFKC

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-06-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-19
        • 2022-12-17
        • 1970-01-01
        相关资源
        最近更新 更多