Javascript - 标准化带重音的希腊字符

2023-11-23

我正在尝试对希腊文本应用某种标准化(使用小写字母,删除重音符号并将 ς 替换为 σ)。例如,我希望“ἀντίθεσις”(希腊语多调)和“αντίθεσις”(现代希腊语)变成“αντιθεσισ”。 我跑过unicode-table.com并写下我应该替换哪些角色。

Greek and Coptic (Range: 0370— 03FF) 
ΆΑά -> α
ΈΕέ -> ε
ΉΗή -> η
ΊΪΙίΐ -> ι
ΌΟό -> ο
ΎΫΥΰϋύ -> υ
ΏΩώ -> ω

Greek Extended (Range: 1F00— 1FFF)
ἀἁἂἃἄἅἆἇὰάᾀᾁᾂᾃᾄᾅᾆᾇᾰᾱᾲᾳᾴᾶᾷἈἉἊἋἌἍἎἏᾈᾉᾊᾋᾌᾍᾎᾏᾸᾹᾺΆᾼ -> α
ἐἑἒἓἔἕὲέἘἙἚἛἜἝῈΈ -> ε
ἠἡἢἣἤἥἦἧὴήᾐᾑᾒᾓᾔᾕᾖᾗῂῃῄῆῇἨἩἪἫἬἭἮἯᾘᾙᾚᾛᾜᾝᾞᾟῊΉῌ -> η
ἰἱἲἳἴἵἶἷὶίῐῑῒΐῖῗἸἹἺἻἼἽἾἿῘῙῚΊ -> ι
ὀὁὂὃὄὅὸόὈὉὊὋὌὍῸΌ -> ο
ὐὑὒὓὔὕὖὗὺύῠῡῢΰῦῧὙὛὝὟῨῩῪΎ -> υ
ὠὡὢὣὤὥὦὧὼώᾠᾡᾢᾣᾤᾥᾦᾧῲῳῴῶῷὨὩὪὫὬὭὮὯᾨᾩᾪᾫᾬᾭᾮᾯῺΏῼ -> ω
ῤῥῬ -> ρ

我想知道是否有一种聪明的方法来进行这些替换并避免逐个字符地检查字符串。

第一次尝试(谢谢@Tyblitz)

normal = 'Αντίθετα με αυτό που θεωρεί η πλειοψηφία, το Lorem Ipsum δεν είναι απλά ένα τυχαίο κείμενο. Οι ρίζες του βρίσκονται σε ένα κείμενο Λατινικής λογοτεχνίας του 45 π.Χ., φτάνοντας την ηλικία του πάνω από 2000 έτη.';

pol = 'Μήγαρις ἔχω ἄλλο στὸ νοῦ μου πάρεξ ἐλευθερία καὶ γλώσσα;';

console.log(normalizeGreek(normal));
console.log(normalizePolytonicGreek(pol));

function normalizeGreek(text) {
    text = text.replace(/Ά|Α|ά/g, 'α')
        .replace(/Έ|Ε|έ/g, 'ε')
        .replace(/Ή|Η|ή/g, 'η')
        .replace(/Ί|Ϊ|Ι|ί|ΐ|ϊ/g, 'ι')
        .replace(/Ό|Ο|ό/g, 'ο')
        .replace(/Ύ|Ϋ|Υ|ύ|ΰ|ϋ/g, 'υ')
        .replace(/Ώ|Ω|ώ/g, 'ω')
        .replace(/Σ|ς/g, 'σ');
    return text;
}


function normalizePolytonicGreek(text) {
    text = text.replace(/Ά|Α|ά|ἀ|ἁ|ἂ|ἃ|ἄ|ἅ|ἆ|ἇ|ὰ|ά|ᾀ|ᾁ|ᾂ|ᾃ|ᾄ|ᾅ|ᾆ|ᾇ|ᾰ|ᾱ|ᾲ|ᾳ|ᾴ|ᾶ|ᾷ|Ἀ|Ἁ|Ἂ|Ἃ|Ἄ|Ἅ|Ἆ|Ἇ|ᾈ|ᾉ|ᾊ|ᾋ|ᾌ|ᾍ|ᾎ|ᾏ|Ᾰ|Ᾱ|Ὰ|Ά|ᾼ/g, 'α')
        .replace(/Έ|Ε|έ|ἐ|ἑ|ἒ|ἓ|ἔ|ἕ|ὲ|έ|Ἐ|Ἑ|Ἒ|Ἓ|Ἔ|Ἕ|Ὲ|Έ/g, 'ε')
        .replace(/Ή|Η|ή|ἠ|ἡ|ἢ|ἣ|ἤ|ἥ|ἦ|ἧ|ὴ|ή|ᾐ|ᾑ|ᾒ|ᾓ|ᾔ|ᾕ|ᾖ|ᾗ|ῂ|ῃ|ῄ|ῆ|ῇ|Ἠ|Ἡ|Ἢ|Ἣ|Ἤ|Ἥ|Ἦ|Ἧ|ᾘ|ᾙ|ᾚ|ᾛ|ᾜ|ᾝ|ᾞ|ᾟ|Ὴ|Ή|ῌ/g, 'η')
        .replace(/Ί|Ϊ|Ι|ί|ΐ|ἰ|ἱ|ἲ|ἳ|ἴ|ἵ|ἶ|ἷ|ὶ|ί|ῐ|ῑ|ῒ|ΐ|ῖ|ῗ|Ἰ|Ἱ|Ἲ|Ἳ|Ἴ|Ἵ|Ἶ|Ἷ|Ῐ|Ῑ|Ὶ|Ί/g, 'ι')
        .replace(/Ό|Ο|ό|ὀ|ὁ|ὂ|ὃ|ὄ|ὅ|ὸ|ό|Ὀ|Ὁ|Ὂ|Ὃ|Ὄ|Ὅ|Ὸ|Ό/g, 'ο')
        .replace(/Ύ|Ϋ|Υ|ΰ|ϋ|ύ|ὐ|ὑ|ὒ|ὓ|ὔ|ὕ|ὖ|ὗ|ὺ|ύ|ῠ|ῡ|ῢ|ΰ|ῦ|ῧ|Ὑ|Ὓ|Ὕ|Ὗ|Ῠ|Ῡ|Ὺ|Ύ/g, 'υ')
        .replace(/Ώ|Ω|ώ|ὠ|ὡ|ὢ|ὣ|ὤ|ὥ|ὦ|ὧ|ὼ|ώ|ᾠ|ᾡ|ᾢ|ᾣ|ᾤ|ᾥ|ᾦ|ᾧ|ῲ|ῳ|ῴ|ῶ|ῷ|Ὠ|Ὡ|Ὢ|Ὣ|Ὤ|Ὥ|Ὦ|Ὧ|ᾨ|ᾩ|ᾪ|ᾫ|ᾬ|ᾭ|ᾮ|ᾯ|Ὼ|Ώ|ῼ/g, 'ω')
        .replace(/ῤ|ῥ|Ῥ/g, 'ρ')
        .replace(/Σ|ς/g, 'σ');
    return text;
}

2nd try:

检查我的answer下面利用String.prototype.normalize()并阻止您保留包含 unicode 表中所有希腊重音字符的列表。


我还发现了以下解决方案:String.prototype.normalize()

normal = 'Αντίθετα με αυτό που θεωρεί η πλειοψηφία, το Lorem Ipsum δεν είναι απλά ένα τυχαίο κείμενο. Οι ρίζες του βρίσκονται σε ένα κείμενο Λατινικής λογοτεχνίας του 45 π.Χ., φτάνοντας την ηλικία του πάνω από 2000 έτη.';

pol = 'Μήγαρις ἔχω ἄλλο στὸ νοῦ μου πάρεξ ἐλευθερία καὶ γλώσσα;';

console.log(normalizeGreek(normal));
console.log(normalizePolytonicGreek(pol));

function normalizeGreek(text) {
    return text.normalize('NFD').replace(/[\u0300-\u036f]/g, "");
}


function normalizePolytonicGreek(text) {
    return text.normalize('NFD').replace(/[\u0300-\u036f]/g, "");
}

它是如何工作的+示例:

Inside .normalize('NFD'),重音字符被分解为:

  • 角色本身
  • 随后是等效的组合变音标记(请参阅:范围 [0300-036f])

使用以下方法可以轻松删除这些标记:.replace(/[\u0300-\u036f]/g, "")

a = "ἄ"
console.log(a);             // prints: ἄ
console.log(Array.from(a)); // prints: [ "ἄ" ]

b = a.normalize('NFD')
console.log(b);             // prints: ἄ 
console.log(Array.from(b)); // prints: [ "α", "̓", "́" ]

c = a.normalize('NFD').replace(/[\u0300-\u036f]/g, "")
console.log(c);             // prints: α
console.log(Array.from(c)); // prints: [ "α" ]

有趣的链接:

  • Unicode® 标准附件 #15 - Unicode 规范化形式
  • 标准化图表
  • 在 JavaScript 中删除字符串中的重音符号/变音符号
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Javascript - 标准化带重音的希腊字符 的相关文章

  • 如何使用 selenium 和 Mocha 获取 xPath() 选择的锚标记的文本

    我已经成功选择了 a 标签 我想显示锚标记的文本 但无法这样做 我正在使用 selenium mocha javascript 和 phantomJS 这是我的脚本 详细 var assert require assert var test
  • 网站 YouTube 嵌入视频不断播放

    我正在使用 youtube 提供的 iframe 在我的网站上嵌入视频 我还使用了一个 css 弹出窗口 这是我从这个页面学到的http www pat burt com web development how to do a css po
  • 如何使用 JavaScript 中的值填充下拉列表?

    我在 Tridion CMS 扩展中的功能区工具栏按钮中添加了一个按钮 单击该按钮后 将显示一个弹出页面 其中包含两个下拉菜单 通过更改第一个下拉控件中的值 我应该填充第二个下拉控件的值 就我而言 我正在使用ASP drop down li
  • jquery 验证错误位置

    这看起来很简单 但我无法弄清楚 我正在使用 jquery 验证插件 我验证所有文件 但我想要的是在输入文本行中显示验证消息警报 例如在电子邮件输入中 请填写电子邮件地址 但现在它出现在所有字段下 在我的html中
  • Jquery从下拉列表中获取所选值的id

    我有一个下拉列表 可以从数据库获取值 如下所示 get getJobs function jobs seljobs jobs var i 0 jobs forEach function n alert job id n id 32 67 4
  • 如何按照编写的顺序迭代 javascript 对象属性

    我发现了代码中的一个错误 我希望通过最少的重构工作来解决该错误 此错误发生在 Chrome 和 Opera 浏览器中 问题 var obj 23 AA 12 BB iterating through obj s properties for
  • Java:正则表达式排除空值

    在问题中here https stackoverflow com questions 51359056 java regexp for a separated group of digits 我得到了正则表达式来匹配 1 到 99 之间的一
  • Ember.js 处理 View 事件后转换到路由

    Setup 我有一个 Ember 应用程序 支持使用 Imgur API 上传图像 我已经有一个工作路线和模板来处理任何 Imgur ID 但我想在上传新图像后转换到此路线 使用返回的 Imgur ID 这是该应用程序的相关部分 http
  • 在为 RXJS 可观察量编写测试时,如何避免让调度程序通过我的业务逻辑?

    我发现使某些测试通过的唯一方法是显式地将调度程序传递给函数 为了便于说明 请考虑以下函数 function doStuff stream return stream delay 100 filter x gt x 2 0 map x gt
  • 如何通过php获取网页的Open Graph协议?

    PHP 有一个简单的命令来获取网页的元标记 get meta tags 但这仅适用于具有名称属性的元标记 然而 开放图谱协议如今变得越来越流行 从网页获取 opg 值的最简单方法是什么 例如 我看到的基本方法是通过 cURL 获取页面并使用
  • javascript中按tab键时如何调用函数?

    我有一个这样的功能 function whenEmpty field if field value field style backgroundColor ffcccc alert Please fill the field field f
  • 通过 node-http-proxy 保留基于 cookie 的会话

    我有一个简单的基于 Express 的 Node js Web 服务器 用于开发 JavaScript 应用程序 我将服务器设置为使用 node http proxy 来代理应用程序向在不同域和端口上运行的 Jetty 服务器发出的 API
  • 如果链接包含特定文本,jQuery 将类添加到 href

    我的网站上的列表中有一些动态填充的链接 这些链接链接到文件 是否可以使用 jQuery 查看文件名是否以 pdf 结尾 并在 href 或类似的链接文本以 mp3 结尾时添加一个类 例如 我的列表中有以下链接 文件1 pdf 歌曲1 mp3
  • Javascript - 将值从下拉框传递到 Google Maps API

    我正在使用 Google 地图 API 为一家出租车公司创建报价表 目前 用户在 2 个文本框中输入出发点和接载点 API 会计算两点之间的距离以及行程费用 我正在尝试添加两个具有设定位置的下拉框 以便用户可以选择这些位置之一或使用文本框输
  • 如何流式传输 OpenAI 的完成 API?

    我想流式传输结果通过 OpenAI 的 API 完成 https beta openai com docs api reference completions 该文档提到使用服务器发送的事件 https developer mozilla
  • 如何在 Angular 中从父组件访问子组件?

    I have mat paginator在子组件a中 如下所示 子组件 html
  • 使用 JS 合并具有相同值的相邻 HTML 表格单元格

    我已经为此苦苦挣扎了一段时间 我有一个根据一些 JSON 数据自动生成的表 该数据可能会有所不同 我想合并第一列中具有相同值的相邻单元格 例如此表中的 鱼 和 鸟 table tr td fish td td salmon td tr tr
  • JS用正则表达式替换数字

    我有元素的标识符 如下所示 form book 1 2 3 我想要的是用其他值替换该标识符中的第二个数字 我将函数 match 与以下正则表达式一起使用 var regexp d d d 但它返回我包含的数组 1 2 3 2 因此 当我尝试
  • 如何获取 UIWebView 中元素的位置?

    我在 iPad 程序中加载了 html 的 UIWebView 通过使用 webkit column width 我将 html 分为几列 padding 0px height 1024px webkit column gap 0px we
  • Jquery - 通过在字符串中构建 id 的 id 获取元素

    我在使用 jquery 元素时遇到问题 我正在 var 中构造名称 例如 var myId myGotId myId attr title changed myId 返回空 我想通过 id 获取我的元素 但动态构建我的 Id 连接字符串 编

随机推荐

  • Excel COM add 在启动期间未加载,必须手动添加

    Excel COM 插件在启动期间未加载 每次我都必须手动添加它 检查后文件 gt 选项 gt 加载项 gt 管理 gt COM 加载项 我看到 加载项 处于 已卸载 状态 不知道如何让它在启动时自动加载 这就是为我解决问题的方法 Step
  • 保存枕头图像时如何正确设置 DPI?

    我正在尝试使用Python以编程方式创建图像枕头库但我遇到图像内文本的图像质量问题 我想将生成的图像保存为 PNG 因此我在保存时设置 DPIthis 但我是否保存dpi 72 72 or dpi 600 600 它在视觉上看起来是一样的
  • asp.net c# SqlDataSource超时问题

    我试图将 SqlDataSource 的超时时间延长到 30 秒以上 似乎是默认值 我正在尝试运行一个必须运行 100 000 条记录的存储过程 在繁忙期间它会超时 我在 2003 服务器上使用 ASP NET 4 0 和 IIS 6 0
  • C++ Vector at/[] 运算符速度

    为了给函数提供修改向量的选项 我不能这样做 curr myvec at i doThis curr doThat curr doStuffWith curr 但我必须这样做 doThis myvec at i doThat myvec at
  • 如何重置nodejs流?

    如何重置nodejs流 如何在nodejs中再次读取流 提前致谢 var fs require fs var lineReader require line reader proxy txt only 3 lines var readStr
  • 为什么非正规浮点值处理起来较慢?

    通常情况下 消耗或产生非正规值的浮点值比其他情况慢 有时慢得多 为什么会这样呢 如果是因为它们被软件捕获而不是直接在硬件中处理 据说在某些 CPU 上就是如此 那么为什么它们必须这样做呢 对于 IEEE 754 浮点 遇到的大多数操作数都是
  • 使用 weave 作为网络在 kubernetes 内运行的 docker 容器内没有互联网连接

    我有一个在 AWS EC2 实例上运行的 kubernetes 集群 并编织为网络 cni 我已经禁用了 docker 网络 ipmask 和 iptables 因为它是由 weave 管理的 以避免网络冲突 我已经在这个集群上部署了 Je
  • TortoiseGit 克隆选项在右键单击上下文菜单中不可用

    我已在 Windows 7 64 位计算机上安装了 Git 2 5 2 64 位和 TortoiseGit 1 8 16 0 64 位 我想克隆存储库 但是当我在 Windows 资源管理器中右键单击时 我没有看到克隆存储库的选项 我已经转
  • php 中的 cURL 选项 - 什么选项是 -u [关闭]

    Closed 这个问题是无关 目前不接受答案 我的参考文献列出了一个选项 curl u ExactID Password 这是否意味着我只需使用 CURLOPT USERPWD 并使用 ExactID Password 格式 是的 CLI
  • 如何设置 django 和 mysql 使用 UTF-8

    我想将 Django mysql 站点设置为使用 UTF 8 请指导我必须在 django 和 mysql 中进行的更改 以确保以下事项 用户在表单中输入的数据将始终编码为 UTF 8 将数据以utf 8存储在mysql中 正确显示模板中的
  • 确定某个值是否在 TensorFlow 中的集合中

    The tf logical or tf logical and and tf select功能非常有用 但是 假设你有价值x 并且您想看看它是否在set a b c d e 在 python 中你只需写 if x in set a b c
  • 在没有root访问权限的情况下安装python包[重复]

    这个问题在这里已经有答案了 我想在我使用的服务器中安装python包networkx 在问这个问题之前我进行了搜索 它说使用 pip install user networkx 但它不起作用 linux错误是 Usage usr bin p
  • 在android中缩放和平移位图

    我正在尝试出售位图并在每一步进行翻译 如果我们看下面的代码 我正在绘制一个图像 对其进行平移和缩放 然后反向执行相同的操作 以便恢复原始配置 但在应用操作后 我确实得到了原始缩放图像 比例因子 1 但图像被平移到不同的位置 您能指出正确的方
  • 根据文本调整 UILabel 高度

    考虑我有以下文本UILabel 一长行动态文本 由于外星军队的数量远远超过团队 玩家必须利用后世界末日的世界来发挥自己的优势 例如在垃圾箱 柱子 汽车 瓦砾和其他物体后面寻找掩护 我想调整大小UILabel s高度 以便文本可以适合 我正在
  • 在 iOS 7 中使用相机时,应用程序因内存压力而终止

    我面临错误应用程序因内存压力而终止当我使用 UIImagePickerController Camera 捕获一些图像时 我首先收到内存警告 然后应用程序突然崩溃 这个问题在 iOS 7 中特别明显 在 iOS 6 中它工作得很好 有人知道
  • Jenkins 管道条件环境变量

    我有一组静态环境变量environmental声明性管道的指令部分 这些值可用于管道中的每个阶段 我希望这些值根据任意条件而改变 有没有办法做到这一点 pipeline agent any environment if params con
  • jQuery:如何在页面加载时滚动到某个锚点/div?

    最近我尝试更频繁地使用 jquery 现在我遇到一些问题 我想用 jquery 解决 希望你能帮助我 我有一些包含一些锚标记的网页 假设锚位于页面中间 并且在事件加载时我希望页面在某个锚标记位置启动 这意味着页面将自动 滚动 到某个位置 这
  • 如何处理 System.Data.DataTableExtensions.CopyToDataTable() 中的缺陷

    我遇到了一些可能是扩展方法中的缺陷的事情 CopyToDataTable 此方法用于导入 在 VB NET 中 System Data DataTableExtensions然后针对 IEnumerable 调用该方法 如果您想使用 LIN
  • 无法加载 /usr/local/lib 中存在的共享库 (Fedora x64)

    当尝试运行我刚刚成功编译的程序时 出现以下错误 src sensors laser scan Producer 加载共享库时出错 liblcm so 1 无法打开共享对象文件 没有这样的文件或目录 ls usr local lib libl
  • Javascript - 标准化带重音的希腊字符

    我正在尝试对希腊文本应用某种标准化 使用小写字母 删除重音符号并将 替换为 例如 我希望 希腊语多调 和 现代希腊语 变成 我跑过unicode table com并写下我应该替换哪些角色 Greek and Coptic Range 03