移除这个具体字符串的样式?



我从一个网页中提取了以下字符串。它似乎以某种方式包含字体样式,这使得它很难使用。我想用Python把它转换成普通的无样式字符。

下面是字符串:

𝗸𝗲𝗲𝗽 𝘁𝗮𝗸𝗶𝗻𝗴 𝗽𝗿𝗲𝗰𝗮𝘂𝘁𝗶𝗼𝗻𝘀

该字符串中的字符是用于数学排版的特殊Unicode码点。虽然它们不应该在其他情况下使用,但许多网页滥用Unicode来创建样式文本;它最常见于不允许HTML样式的地方(如StackOverflow注释:-)

如注释所示,您可以使用标准unicodedata模块的normalize方法将这些Unicode字符转换为普通的无样式字母字符,以进行"兼容性(K)组合(C)";正常化。

unicodedata.normalize("NFKC", "𝗸𝗲𝗲𝗽 𝘁𝗮𝗸𝗶𝗻𝗴 𝗽𝗿𝗲𝗰𝗮𝘂𝘁𝗶𝗼𝗻𝘀")

有四种规范化形式,它们结合了两个轴:

  • 作文分解或:某些字符(如ñÖ)有自己的Unicode码点,尽管Unicode也包括一种机制——零宽度"组合字符"——来应用装饰("重音")。或"号")到任何字符。具有自己代码的预组合字符基本上是为了支持旧的编码(如ISO-8859-x),这些编码将这些字符作为单个字符包含。例如,Ñ在ISO-8859-1 ("latin-1")中是十六进制的D1,并且它被赋予了Unicode码点U+00D1,以便更容易地转换期望它是单个字符的程序。Latin-1也包括Õ(如D5),但不包括T/;在Unicode中,我们把T写成两个字符:一个大写的T后面跟着一个"(U + 0054 U + 0303)。这意味着我们可以用两种方式编写Ñ:作为Ñ,单个组成的代码点U+00D1,或作为Ñ,两个代码序列U+004E U+0303。如果您的显示软件进行了良好的调优,那么这两种可能性看起来应该是相同的,并且根据Unicode标准,它们在语义上是相同的,但是由于代码不同,它们不会在逐字节比较中比较相同的内容。
    • 作文(C)规范化将多码序列转换为其组成的单码版本,如果存在的话;U+004E U+0303会变成U+00D1。
    • (D)规范化使用组合字符将组成的单码字符转换为语义等效的序列;U+00D1会变成U+004E U+0303
  • (K):一些Unicode码点的存在只是为了强制特定的呈现样式。这包括您遇到的样式化的数学字符,但也包括连字符(如)、上标数字(²)或字母(ª)和一些具有常规含义的字符(µ,意思是"百万分之一",与希腊字符μ不同,或埃斯特姆符号Å,与斯堪的纳维亚字符Å不同)。在兼容性规范化中,这些字符被更改为基本的未样式字符;在某些情况下,这会丢失重要的语义信息,但它可能是有用的。

所有规范化都将代码放入"canonical"排序。具有多个组合标记的字符,如ḉ,可以使用任意顺序的组合标记来书写。为了更容易比较包含这些字符的字符串,Unicode有一个指定的组合顺序,规范化将重新排列组合字符,以便它们可以轻松比较。(注意,这需要在合成后完成,因为这可以改变基本字符。例如,如果基本字符为""分解归一化将基字符更改为"c"然后需要在组合标记序列中插入正确的位置。

最新更新