Javascript - 规范化重音的希腊字符 [英] Javascript - normalize accented greek characters

查看:101
本文介绍了Javascript - 规范化重音的希腊字符的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试对希腊文本应用某种规范化(使用小写,删除重音并用σ替换ς)。例如,我想ἀντίθεσις(希腊语polytonic)和αντίθεσις(现代希腊语)变成αντιθεσισ。
我浏览了 unicode-table.com 并写下了我应该做的字符替换。

I am trying to apply some kind of normalization to greek text (use lower case, remove accents and replace ς with σ). For example I would like "ἀντίθεσις" (greek polytonic) and "αντίθεσις" (modern greek) become "αντιθεσισ". I ran through unicode-table.com and wrote down which character replacements I should do.

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

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

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

I am wondering if there is a smart way to do these replacements and avoid checking strings character by character.

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;
}

检查下面的答案,其中使用 String.prototype .normalize()并阻止你保留包含unicode表中所有希腊重音字符的列表。

Check my answer below which makes use of String.prototype.normalize() and prevents you from keeping lists with all the greek accented characters from the unicode table.

推荐答案

我认为你不能以另一种方式做到这一点,而不是通过检查每个字母,但这并没有使它更糟。

I don't think you can do it in another way than by checking for each letter, but that doesn't make it any worse.

只需链接你的 .replace 等函数:

result = string.replace(/Ά|Α|ά/g,'α')
  .replace(/Έ|Ε|έ/g,'ε')
  .replace(/Ή|Η|ή/g,'η');
// & so on...   

或者如果你宁愿循环它,如果你有更大的话,你可能会这样做要检查的字符数量,以及更好的代码可维护性,将字符匹配存储在对象/数组的数组中。
例如。对象:

Or if you rather loop over it, which you presumably do if you have greater amounts of characters to check against,and which is also better for code maintainability, store the character matches in an array of objects/ arrays. Eg. with an object:

var cvtValues =  [ /* from = chars to convert; to = conversion output */
  {from:['Ά','Α','ά'], to: 'α'}
  {from:['Έ','Ε','έ'], to: 'ε'}
  {from:['Ή','Η','ή'], to: 'η'}];
/* loop over all from-to containers */
for ( var i = 0; i < cvtValues.length; i++ ) {
  /* loop over all characters in the 'from' array & replace them with 'to' value*/
  for ( var x = 0; x < cvtValues[i].from.length; x++ ) {
    string = string.replace(new RegExp(cvtValues[i].from[x],'g'), cvtValues[i].to);
    /* You could assign this to another variable, eg. result if you wated */
  }
}

这篇关于Javascript - 规范化重音的希腊字符的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆