![替换组合的 unicode 字符](https://linux22.com/image/83255/%E6%9B%BF%E6%8D%A2%E7%BB%84%E5%90%88%E7%9A%84%20unicode%20%E5%AD%97%E7%AC%A6.png)
我有一个包含预组合 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 字节),但 Å 或 ö 不会,然后会转换为 aA
和o
近似值)。
Å
如果您的意思是您的输入包含分解字符(如和ö
)和预组合字符(如)的组合,й
并且您想保留预组合字符,但丢弃分解字符中的组合字符,那么您可以执行以下操作:
$ 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
,粘贴我复制的内容,转到迷你缓冲区的开头,删除之前的字符,然后运行命令。
我认为重音更像是一个前字符,因此通过复制我想要的字符和之前的字符,我确保复制我想要的所有内容。