【问题标题】:Convert non-ASCII characters (umlauts, accents...) to their closest ASCII equivalent (slug creation)将非 ASCII 字符(变音符号、重音符号...)转换为最接近的 ASCII 等效字符(创建 slug)
【发布时间】: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 我的(非专家)假设是所有变音符号都被“重音”覆盖。当然,继续吧,这听起来是个不错的妥协

标签: javascript character-encoding ascii converter slug


【解决方案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');

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-16
    • 2012-06-18
    • 1970-01-01
    • 1970-01-01
    • 2011-02-08
    • 2016-10-22
    • 2018-11-23
    相关资源
    最近更新 更多