我需要一个通用的音译或替换正则表达式,它将扩展的拉丁字符映射到类似的ASCII字符,并将所有其他扩展字符映射到''(空字符串),以便......
é变成了e
ê成为e
á成为一个
ç变成c
Ď成为D.
等等,但是像‡或Ω或‰这样的东西只是被条纹化了.
使用Unicode :: Normalize来获取NFD($ str).在这种形式中,具有变音符号的所有字符将变成基本字符,然后是组合变音字符.然后只需删除所有非ASCII字符.
所有精彩的答案。但没有一个真正有效。在终端窗口或跨平台的各种代码/文本编辑器中工作时,将扩展字符直接放入源代码中会导致问题。我能够尝试 Unicode::Normalize、Text::Unidecode 和 Text::Unaccent,但无法让它们中的任何一个完全按照我想要的方式执行。
\n\n最后,我只是枚举了我想要自己音译为 UTF-8 的所有字符(这是我的输入数据中最常见的代码页)。
\n\n我需要两个额外的替换来处理 \xc3\xa6 和 \xc3\x86 我想映射到两个字符
\n\n对于感兴趣的各方,最终代码是:(tr 是一行)
\n\n$word =~ tr/\\xC0\\xC1\\xC2\\xC3\\xC4\\xC5\\xC7\\xC8\\xC9\\xCA\\xCB\\xCC\\xCD\\xCE\\xCF\n\\xD0\\xD1\\xD2\\xD3\\xD4\\xD5\\xD6\\xD8\\xD9\\xDA\\xDB\\xDC\\xDD\\xE0\\xE1\\xE2\\xE3\\xE4\n\\xE5\\xE7\\xE8\\xE9\\xEA\\xEB\\xEC\\xED\\xEE\\xEF\\xF0\\xF1\\xF2\\xF3\\xF4\\xF5\\xF6\\xF8\n\\xF9\\xFA\\xFB\\xFC\\xFD\\xFF/AAAAAACEEEEIIIIDNOOOOOOUUUUYaaaaaaceeeeiiiionoo\noooouuuuyy/;\n$word =~ s/\\xC6/AE/g;\n$word =~ s/\\xE6/ae/g;\n$word =~ s/[^\\x00-\\x7F]+//g;\nRun Code Online (Sandbox Code Playgroud)\n\n由于像 \xc4\x8e 这样的东西不是 UTF-8 的一部分,因此它们在我的输入数据中几乎不会出现。对于非 UTF-8 输入,我选择放弃 127 以上的所有内容。
\n