替换组合的 unicode 字符

替换组合的 unicode 字符

我有一个包含预组合 unicode 字符的文件。这是关于它的维基百科页面。我有一个像“Åström”这样的单词,但重音符号不在这种语言的字母表中。我想摆脱它们,但不知道如何 - 我尝试过复制和粘贴字符(之前对一些字符有用过 - 可能它们没有组合),但这并没有给出预期的结果。

答案1

Åström分解的unicode 字符,不是预作的那些:

(我假设当前语言环境使用 UTF-8,并且在命令行中输入的字符在此处使用 UTF-8 编码(我从使用 UTF-8 的浏览器中复制粘贴了它们))。

$ printf %s Åström | uconv -x any-name
\N{LATIN CAPITAL LETTER A}\N{COMBINING RING ABOVE}\N{LATIN SMALL LETTER S}\N{LATIN SMALL LETTER T}\N{LATIN SMALL LETTER R}\N{LATIN SMALL LETTER O}\N{COMBINING DIAERESIS}\N{LATIN SMALL LETTER M}

请注意结合上面的变音符号。预先组合的将是:

$ printf %s Åström | uconv -x nfkc | uconv -x any-name
\N{LATIN CAPITAL LETTER A WITH RING ABOVE}\N{LATIN SMALL LETTER S}\N{LATIN SMALL LETTER T}\N{LATIN SMALL LETTER R}\N{LATIN SMALL LETTER O WITH DIAERESIS}\N{LATIN SMALL LETTER M}

与组合重音相反的那些预组合字符存在于 iso8859-1 或 iso8859-15 中。因此,如果这是预期的目标字符集,您可以这样做:

$ printf %s Åström | uconv -x nfkc -t iso-8859-1

要转换可转换的字符,请近似其他字符:

$ printf %s 'Åström й' | uconv -x nfkc | iconv -t iso-8859-5//TRANSLIT
Astrom <0xd9>

(© 在 iso-8859-5 字符集中,因此会转换为它的表示形式(0xd9 字节),但 Å 或 ö 不会,然后会转换为 aAo近似值)。

如果您的意思是您的输入包含分解字符(如和)和预组合字符(如)的组合,й并且您想保留预组合字符,但丢弃分解字符中的组合字符,那么您可以执行以下操作:

$ printf %s 'Åström й' | uconv -x '[:Nonspacing Mark:]>'
Astrom й

请注意,Unicode 中有两个具有Å视觉表示的字符:U+212B (Ångström) 和 U+00C5(上面有环的 A)。nfkc将把 U+212B 转换为 U+00C5。

如果您想删除所有变音符号,您可以尝试:

$ printf %s Åström | iconv -t us//TRANSLIT
Astrom

(请注意,某些实现可能会用相邻或...字符iconv来近似重音)"'

或者:

$ printf %s Åström | uconv -x nfd -c -t us
Astrom

(分解、转换为 ASCII、删除无法转换的字符,如组合重音符号)。

或者:

$ printf %s Åström | uconv -x "::nfd;[:Nonspacing Mark:]>;"
Astrom

(分解,去掉所有非空格标记)

或者:

$ printf %s Åström | uconv -x Latin-ASCII
Astrom

(拉丁字母字符的 ASCII 音译)。

uconv是一个实用程序重症监护室项目。在 Debian 及其衍生版本上,您可以在icu-devtools软件包中找到它。

答案2

CPAN 中有一个 perl 模块 Text::Unaccent 可供您使用:

http://search.cpan.org/~ldachary/Text-Unaccent-1.08/Unaccent.pm

示例 perl 脚本(从 STDIN 到 STDOUT)可能如下所示:

#!/usr/bin/perl
use Text::Unaccent;
while ($zeile = <STDIN>)
{
   print STDOUT unac_string("UTF-8", $zeile);
}

答案3

我使用的解决方案是使用Emacs.我打开文件,找到带有重音符号的部分,复制带有重音符号的字符以及重音符号之前的一个字符。我转到文件的开头,运行M-x replace-string,粘贴我复制的内容,转到迷你缓冲区的开头,删除之前的字符,然后运行命令。

我认为重音更像是一个前字符,因此通过复制我想要的字符和之前的字符,我确保复制我想要的所有内容。

相关内容