将非ASCII字符(如umlauts、重音符号等)转换为最接近的ASCII等效字符(用于创建slug)。

39
我正在寻找一种在JavaScript中将字符串中的非ASCII字符转换为最接近的等效字符的方法,类似于PHP的iconv函数的功能。例如,如果输入字符串是“Rånades på Skyttis i Ö-vik”,它应该被转换为“Ranades pa skyttis i o-vik”。我查看了phpjs,但没有包含iconv。
在JavaScript中是否可能执行这样的转换,如果可以,如何执行?
注: - 更一般地,这个转换过程被称为音译。 - 我的用例是创建URL slug。

相关(但不是真正的通用解决方案):在JavaScript字符串中删除umlauts或specialchars - Pekka
这在JavaScript中可能无法本地实现,除非维护大量的替换表(至少我从未见过可以这样做的方法)。难道没有办法将数据发送到服务器并在那里使用iconv吗? - Pekka
1
我曾经创建过一个执行此操作的函数。请访问http://userscripts.org/scripts/review/112070,Ctrl + F“var RW759_normalize_accents”。它被用于规范化搜索字符,我记得使用一种专门为此目的制作的工具手动选择了这些字符。基于此Q&A:https://dev59.com/questions/m3VC5IYBdhLWcg3woSxW - Rob W
@user 我(非专家)的假设是所有变音符号都被“重音符”覆盖了。当然,继续吧,这听起来像一个不错的妥协。 - Pekka
1
这个回答是否解决了您的问题?在JavaScript中删除字符串中的重音/变音符号 - RiZKiT
显示剩余3条评论
3个回答

39

2
ECMAScript 6(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/normalize)目前只有最新版本的Chrome和Firefox alphas支持。虽然很有前途。 - Álvaro González
我在NodeJS中使用了这种方法。也许有一些Unicode规范化模块适用于客户端,比如unorm - Rez
Node.js 无论如何都有 iconv 端口。 - Álvaro González
是的,但没有必要使用额外的模块。 - Rez
3
挪威语中的字母,如ø或æ,需要翻译吗? - Michal Biros

4
我建议使用Unicode包,它还将希腊字母和西里尔字母映射到最接近的ascii符号:
unidecode('Lillı Celiné Никита Ödipus');

'

利利·塞琳·尼基塔·奥狄浦斯

'

3
因为iconv是最常见的i18n字符映射转换函数背后本地编译的UNIX实用程序。
在JavaScript中,你不会找到它,除非你访问一些浏览器组件。
编码是文档的属性,所以大多数JavaScript实现只是简单地忽略它。
你需要一个纯JS库来处理无音符号字符串。最好有一个针对你需要的特定语言的库。
最简单的方法是通过一些翻译表或甚至是正则表达式替换。
像这样:http://lehelk.com/2011/05/06/script-to-remove-diacritics/ 也可以查看这个线程: Replacing diacritics in Javascript

1
我刚意识到用单个ASCII字符替换变音符号并不理想。例如,在德语中,应将ü转换为ue而不仅仅是u,请参见http://webmasters.stackexchange.com/questions/33032/how-to-handle-urls-with-diacritic-characters。似乎即使是`iconv`也无法做到这一点(`php -r 'setLocale(LC_ALL,"de_DE"); echo iconv("UTF-8", "ASCII//TRANSLIT", "ü");' // -> u),因此我打算自己创建翻译表(基于iconv并手动调整),并将其用于JavaCriptPHP`。 - Max
根据这个iconv用户评论,如果区域设置为德语,那么iconv将把ü转换为ue - icc97

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接