将非 ASCII 字符(变音符号、重音符号...)转换为最接近的 ASCII 等效字符(创建 slug)

Posted

技术标签:

【中文标题】将非 ASCII 字符(变音符号、重音符号...)转换为最接近的 ASCII 等效字符(创建 slug)【英文标题】:Convert non-ASCII characters (umlauts, accents...) to their closest ASCII equivalent (slug creation) 【发布时间】:2012-08-02 16:36:51 【问题描述】:

我正在寻找在javascript 中将字符串中的非ASCII 字符转换为最接近的等价物的方法,类似于php iconv 函数的作用。例如,如果输入字符串为Rånades på Skyttis i Ö-vik,则应将其转换为Ranades pa skyttis i o-vik。我查看了phpjs,但不包括iconv

是否可以在 JavaScript 中进行这种转换,如果可以,如何实现?

【问题讨论】:

相关(但不是真正的一揽子解决方案):remove umlauts or specialchars in javascript string 如果不维护巨大的替换表,这可能在 JavaScript 中是不可能的(至少,我从未见过这样做的方法)。没有办法将数据发送到服务器并在那里使用 iconv? 我曾经创建了一个函数来做这个。参见userscripts.org/scripts/review/112070,Ctrl+F "var RW759_normalize_accents"。它用于对搜索字符进行规范化,我使用为特定目的制作的工具手动选择了字符 iirc。基于this Q&A @Pekka:你不认为通过编辑标题,你缩小了问题的范围吗?我最初写了non-ASCII characters,你用characters with umlauts/accents代替了它。对我来说,除了umlautsaccents 之外,还有很多其他字符也应该被转换:en.wikipedia.org/wiki/Diacritic。也许将标题改写为Convert non-ASCII characters (umlauts,accents...) to their closest ASCII equivalent (slug creation) 会是一个不错的折衷方案? @user 我的(非专家)假设是所有变音符号都被“重音”覆盖。当然,继续吧,这听起来是个不错的妥协 【参考方案1】:

我发现的最简单的方法:

var str = "Rånades på Skyttis i Ö-vik";
var combining = /[\u0300-\u036F]/g; 

console.log(str.normalize('NFKD').replace(combining, ''));

参考见https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/normalize

【讨论】:

ECMAScript 6。截至今天,它仅受最新的 Chrome 和 Firefox alpha 支持。不过很有希望。 我在NodeJS中使用了这个方法。也许有一些客户端的 Unicode 规范化模块,比如 unorm Node.js 有 iconv 端口。 可以,但不需要使用额外的模块 像ø或æ这样的挪威字符怎么样?【参考方案2】:

这是因为iconv 是大多数 i18n 字符映射转换函数背后的原生编译 UNIX 实用程序。

除非您访问某些浏览器组件,否则您不会在 javascript 中找到它。

编码是文档的一个属性,所以大多数 javascript 实现只是简单地忽略它。

您需要一个纯 js 库来处理非重音字符串。最好为您需要的特定语言提供一个。

最简单的方法是通过一些翻译表甚至正则表达式替换。

喜欢这里:http://lehelk.com/2011/05/06/script-to-remove-diacritics/

也检查这个线程:Replacing diacritics in Javascript

【讨论】:

我刚刚意识到用单个 ASCII 字符替换变音符号并不理想。例如在德语中,ü 应转换为 ue 而不仅仅是 u,请参阅 webmasters.stackexchange.com/questions/33032/…。似乎即使iconv 也没有做 ir (php -r 'setLocale(LC_ALL,"de_DE"); echo iconv("UTF-8", "ASCII//TRANSLIT", "ü");' // -> u),因此我想我要自己创建翻译表(基于 iconv 并手动调整)并将它们用于 JavaCriptPHP . 根据iconv user comment,如果区域设置为德语,iconv 会将ü 转换为ue【参考方案3】:

我会推荐Unicode 包,它还会将希腊和西里尔字母映射到最接近的ascii 符号:

unidecode('Lillı Celiné Никита Ödipus');

“莉莉·席琳·尼基塔·奥狄浦斯”

【讨论】:

以上是关于将非 ASCII 字符(变音符号、重音符号...)转换为最接近的 ASCII 等效字符(创建 slug)的主要内容,如果未能解决你的问题,请参考以下文章

在 JavaScript 中删除字符串中的重音符号/变音符号

如何从 .NET 中的字符串中删除变音符号(重音符号)?

如何从 .NET 中的字符串中删除变音符号(重音符号)?

使用正则表达式剥离字符失败,使用带有变音符号,撇号,重音符号等的文字字符

MongoDB 匹配部分文本忽略重音符号(变音符号)

按字母顺序排序时忽略变音符号