替换字符以制作国际字母(变音符号)

2024-06-07

我正在尝试模仿国际键盘的工作方式。如果您使用其中之一死钥匙 http://en.wikipedia.org/wiki/Dead_key后面跟着一个字母,它将它们组合成相应的字符。例如,输入`a会导致à and ^o结果是ô, etc.

我似乎无法让我的正则表达式正常工作(我很讨厌正则表达式!),但这就是我到目前为止所拥有的(demo http://jsfiddle.net/Mottie/jMTjL/):

var txt = "Replacing 'a ^u ~n 'e ^I 'c",

    combos = {
        'a': ['à', 'á', 'ä', 'â'],
        'A': ['À', 'Á', 'Ä', 'Â'],
        'e': ['è', 'é', 'ë', 'ê'],
        'E': ['È', 'É', 'Ë', 'Ê'],
        'i': ['ì', 'í', 'ï', 'î'],
        'I': ['Ì', 'Í', 'Ï', 'Î'],
        'o': ['ò', 'ó', 'ö', 'ô'],
        'O': ['Ò', 'Ó', 'Ö', 'Ô'],
        'u': ['ù', 'ú', 'ü', 'û'],
        'U': ['Ù', 'Ú', 'Ü', 'Û'],
        'y': 'ý',
        'Y': 'Ý',
        'c': 'ç',
        'C': 'Ç',
        'n': 'ñ',
        'N': 'Ñ'
    },

    bslash = /`[(aeiou)]/gi,
    fslash = /\'[(aeiouyc)]/gi,
    ddots = /\"[(aeiou)]/gi,
    caret = /\^[(aeiou)]/gi,
    tidle = /~[(n)]/gi;

// global match
if (txt.match(/[`|\'|\"|\^|~][aeiouycn]/i)) {

    // back slash - replace `a with à
    if (bslash.test(txt)) {
        txt = txt.replace(bslash, function(r) {
            // r contains the `, so remove it with a slice
            return combos[r.slice(-1)][0];
        });
    }

    // forward slash - replace 'a with á, etc
    if (fslash.test(txt)) {
        txt = txt.replace(fslash, function(r) {
            r = r.slice(-1);
            return (r == 'c' || r == 'y') ? combos[r][0] : combos[r][3];
        });
    }

    // double dots - replace `a with à
    if (ddots.test(txt)) {
        txt = txt.replace(ddots, function(r) {
            return combos[r.slice(-1)][4];
        });
    }

    // caret - replace ^a with â
    if (caret.test(txt)) {
        txt = txt.replace(caret, function(r) {
            return combos[r.slice(-1)][3];
        });
    }

    // tidle - replace ~n with ñ
    if (tidle.test(txt)) {
        txt = txt.replace(tidle, function(r) {
            return combos[r.slice(-1)][0];
        });
    }

    document.write(txt);
}

另外,如果您知道更有效的方法来完成同样的事情,我很乐意听到!


我用 Aefxx 发现的问题更新了上面的答案 - 谢谢!但我决定采用肯尼的方法,因为它更干净,谢谢大家! :) (更新了演示 http://jsfiddle.net/Mottie/jMTjL/1/)

var txt = "Replacing 'a ^u ~n 'e ^I 'c",

 combos = {
  '`' :{ a:'à', A:'À', e:'è', E:'È', i:'ì', I:'Ì', o:'ò', O:'Ò', u:'ù', U:'Ù' },
  "'" :{ a:'á', A:'Á', e:'é', E:'É', i:'í', I:'Í', o:'ó', O:'Ó', u:'ú', U:'Ú', y:'ý', Y:'Ý', c:'ç', C:'Ç' },
  '"' :{ a:'ä', A:'Ä', e:'ë', E:'Ë', i:'ï', I:'Ï', o:'ö', O:'Ö', u:'ü', U:'Ü' },
  '^' :{ a:'â', A:'Â', e:'ê', E:'Ê', i:'î', I:'Î', o:'ô', O:'Ô', u:'û', U:'Û' },
  '~' :{ n:'ñ', N:'Ñ' }
 };

 txt = txt.replace(/([`\'~\^\"])([a-z])/ig, function(s, accent, letter){
   return (accent in combos) ? combos[accent][letter] || s : s;
 });

 document.write(txt);

更完整的方法是 Apache Lucene ASCII Folding 算法的 JavaScript 端口,您可以在以下位置找到https://github.com/mplatt/fold-to-ascii-js https://github.com/mplatt/fold-to-ascii-js它处理您提到的变音符号和更多字符。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

替换字符以制作国际字母(变音符号) 的相关文章

  • 如何对页面的某个部分进行实时更新?

    我需要刷新页面的各个部分 以便在有新数据时进行更新 我该怎么办 使用jquery 例子 是的 jQuery 非常适合这个 查看这些方法 http api jquery com category ajax http api jquery co
  • 无法加载资源:服务器在已部署的 React.js 项目中响应状态为 404(未找到)

    当我将 React 项目部署到 Surge 中时 构建成功并且可以获取应用程序 URL 但是当我链接到 URL 时 我可以在检查控制台中看到一个空白页面和一些错误 Failed to load resource the server res
  • iPhone Web 应用程序禁用缓存

    我使用 PHP 构建了一个 iPhone 网络应用程序 主 也是唯一 页面包括苹果移动网络应用程序支持 and 苹果触摸全屏元标记 以便在添加到主屏幕后可以全屏运行 然而 似乎每次我从主屏幕启动应用程序时 都会使用页面的缓存版本而不是刷新页
  • JavaScript:所有标准内置对象实际上都是构造函数吗?

    我最近一直在研究 JavaScript 在花了几个月的时间之后 我仍然对一些内部结构感到困惑 具体来说 我试图理解所谓的标准内置对象 https developer mozilla org en US docs Web JavaScript
  • 切换 Ag-Grid 中的浮动过滤器?

    我试图通过开关或按钮单击来确定浮动过滤器的显示 看起来很简单 我应该能够在 true 和 false 之间切换 将该值提供给网格选项中的浮动过滤器 然后刷新标题 对吗 不幸的是 网格似乎总是落后一步 当我第一次点击时 什么也没有发生 当我将
  • Karma Webpack - 错误:找不到模块“./test/utilities.js”

    我正在使用 Karma Webpack 进行项目的单元测试 当我跑步时karma start 我有这个错误 Error Cannot find module test utilities js at myproject test campa
  • 正则表达式多次匹配多行

    我有一个像这样的字符串 Name John Doe Age 23 Primary Language English Description This is a multiline description field that I want
  • Array.from 的时间复杂度

    时间复杂度是多少Array from 例如 const set new Set set add car set add cat set add dog console log Array from set time complexity o
  • pointdown 与 onclick:有什么区别?

    两者有什么区别onpointerdown and onclick事件处理程序 有任何实际差异吗 事件在 DOM 树上传播的方式不一样吗 是否有一些设备仅响应这些事件之一 我最初以为这只是pointerdown在触摸设备或笔中触发 但是onc
  • 如何拆分字符串,在特定字符处断开?

    我有这个字符串 john smith 123 Street Apt 4 New York NY 12345 使用 JavaScript 将其解析为最快的方法是什么 var name john smith var street 123 Str
  • 链接index.html client.js 和 server.js

    我从 Node js 开始 我的第一个程序已经遇到了问题 下面是我正在使用的代码 索引 html
  • 多个模板槽的相同槽内容

    在vuejs中 有没有一种方法可以为多个插槽设置相同的内容 而无需复制粘贴 So this
  • Backbone.View:delegateEvents 未将事件重新绑定到子视图

    我已将这个问题分解为尽可能小的示例 即 它只是为了演示问题 不一定代表现实世界的场景 假设我有一个父视图 此处为 MainView 其中包含一个子视图 此处为 SubView 如果在任何时候我需要重新渲染父视图 从而重新渲染子视图 我就会丢
  • 将变量从一个 jsp 发送到另一个 jsp

    我有一个 JSP 文件jsp 1 jsp和另一个 JSP 文件jsp 2 jsp 我已经包括了jsp 2 jsp in jsp 1 jsp using 现在我需要某个元素上的单击事件 在该事件中 我想将字符串变量传输到包含的 jsp 中 假
  • jQuery 分钟和秒倒计时器

    我想创建一个 jquery 倒计时器 我尝试了以下代码 但它不起作用 我该怎么办 DEMO https jsfiddle net tbosn210 https jsfiddle net tbosn210 var interval setIn
  • Javascript 或 Coffeescript 中的“Bucket Fill”算法

    我正在编写一个小coffeescript js应用程序 允许用户设计图标 16x16像素或32X32像素 该图标实际上是一个带有颜色单元的二维数组 单元格可以有颜色或为空 我希望用户能够使用 桶油漆 工具填充空白单元格 代表着 如果用户单击
  • getCompatedStyle 类似于 IE8 的 javascript 函数

    我正在尝试在 Java GWT 代码中编写一个 Javascript 函数 该函数获取以下样式的值 direction fontFamily fontSize fontSizeAdjust fontStyle fontWeight lett
  • 未捕获的类型错误:无法分配给只读属性

    我正在尝试 Nicholas Zakas 所著的 Professional JavaScript for Web Developers 一书中的这个非常简单的示例 但我不知道我在这里做错了什么 我错过了一些非常简单的事情 但我被困住了 这是
  • 如何捕获 google 地图的无效 API 密钥

    我有这个代码 如果密钥无效 则会弹出警报 但我想在这种情况下执行一些操作 但我不知道如何连接它 有任何想法吗 Google 不提供检查 Google 地图 API 密钥的外部方法 因此 您无法使用例如查询某些服务 此代码有效吗abcde12
  • 如何防止外部 CSS 添加和覆盖 ReactJS 组件样式

    我有一个自定义的 ReactJS 组件 我想以某种方式设置样式 并将其作为插件提供给许多不同的网站 但是 当网站使用全局样式 Twitter bootstrap 或其他 css 框架 时 它会添加并覆盖我的组件的样式 例如 全局 css l

随机推荐