我有一份PDF文档,其中包含我要复制并粘贴到HTML文档中的文字。
问题是所有重音字符实际上都是combining diacritical marks而不是single Unicode code points。
因此,例如,é
由Unicode点é
表示,此处编码为两个单独的字符,如é
(e
& ́
)。
这不是很容易处理,特别是因为某些浏览器(Firefox)在重音字母后显示空格而其他一些(Chrome)则没有。
因此,有没有办法自动将那些讨厌的字符转换为友好的单个Unicode代码点字符?
答案 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