将非 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
代替了它。对我来说,除了umlauts
和accents
之外,还有很多其他字符也应该被转换: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
并手动调整)并将它们用于 JavaCript
和 PHP
.
根据iconv user comment,如果区域设置为德语,iconv 会将ü
转换为ue
。【参考方案3】:
我会推荐Unicode 包,它还会将希腊和西里尔字母映射到最接近的ascii 符号:
unidecode('Lillı Celiné Никита Ödipus');
“莉莉·席琳·尼基塔·奥狄浦斯”
【讨论】:
以上是关于将非 ASCII 字符(变音符号、重音符号...)转换为最接近的 ASCII 等效字符(创建 slug)的主要内容,如果未能解决你的问题,请参考以下文章
在 JavaScript 中删除字符串中的重音符号/变音符号