[英]Javascript - normalize accented greek characters
我正在嘗試對希臘文本應用某種標准化(使用小寫,刪除重音並將 ς 替換為 σ)。 例如,我希望“ἀντίθεσις”(希臘多調)和“αντίθεσις”(現代希臘語)變成“αντιθεσισ”。 我瀏覽了unicode-table.com並寫下了我應該做哪些字符替換。
Greek and Coptic (Range: 0370— 03FF)
ΆΑά -> α
ΈΕέ -> ε
ΉΗή -> η
ΊΪΙίΐ -> ι
ΌΟό -> ο
ΎΫΥΰϋύ -> υ
ΏΩώ -> ω
Greek Extended (Range: 1F00— 1FFF)
ἀἁἂἃἄἅἆἇὰάᾀᾁᾂᾃᾄᾅᾆᾇᾰᾱᾲᾳᾴᾶᾷἈἉἊἋἌἍἎἏᾈᾉᾊᾋᾌᾍᾎᾏᾸᾹᾺΆᾼ -> α
ἐἑἒἓἔἕὲέἘἙἚἛἜἝῈΈ -> ε
ἠἡἢἣἤἥἦἧὴήᾐᾑᾒᾓᾔᾕᾖᾗῂῃῄῆῇἨἩἪἫἬἭἮἯᾘᾙᾚᾛᾜᾝᾞᾟῊΉῌ -> η
ἰἱἲἳἴἵἶἷὶίῐῑῒΐῖῗἸἹἺἻἼἽἾἿῘῙῚΊ -> ι
ὀὁὂὃὄὅὸόὈὉὊὋὌὍῸΌ -> ο
ὐὑὒὓὔὕὖὗὺύῠῡῢΰῦῧὙὛὝὟῨῩῪΎ -> υ
ὠὡὢὣὤὥὦὧὼώᾠᾡᾢᾣᾤᾥᾦᾧῲῳῴῶῷὨὩὪὫὬὭὮὯᾨᾩᾪᾫᾬᾭᾮᾯῺΏῼ -> ω
ῤῥῬ -> ρ
我想知道是否有一種聰明的方法來進行這些替換並避免逐個字符地檢查字符串。
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 表中所有希臘重音字符的列表。
我還找到了以下解決方案: 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(/[\̀-\ͯ]/g, ""); } function normalizePolytonicGreek(text) { return text.normalize('NFD').replace(/[\̀-\ͯ]/g, ""); }
在.normalize('NFD')
,重音字符被分解為:
使用以下命令可以輕松刪除這些標記: .replace(/[\̀-\ͯ]/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(/[\̀-\ͯ]/g, "") console.log(c); // prints: α console.log(Array.from(c)); // prints: [ "α" ]
您還可以使用 npm 庫greek-utils ,它具有執行您正在查找的操作的方法,例如替換重音和其他變音符號字符。
對於現代希臘語:
var greekUtils = require('greek-utils');
var sanitized = greekUtils.sanitizeDiacritics('Αρνάκι άσπρο και παχύ');
console.log(sanitized); //Αρνακι ασπρο και παχυ
和古希臘語:
var greekUtils = require('greek-utils');
var sanitized = greekUtils.sanitizeDiacritics('Ἐξ οὗ καὶ δῆλον ὅτι οὐδεμία τῶν ἠθικῶν ἀρετῶν φύσει ἡμῖν ἐγγίνεται');
console.log(sanitized); //Εξ ου και δηλον οτι ουδεμια των ηθικων αρετων φυσει ημιν εγγινεται
我認為除了檢查每個字母之外,您沒有其他方法可以做到這一點,但這並不會使情況變得更糟。
簡單地鏈接你的.replace
函數,如下所示:
result = string.replace(/Ά|Α|ά/g,'α')
.replace(/Έ|Ε|έ/g,'ε')
.replace(/Ή|Η|ή/g,'η');
// & so on...
或者,如果您更願意循環遍歷它,如果您有更多的字符要檢查,並且這對於代碼可維護性也更好,那么您可能會這樣做,請將字符匹配存儲在對象/數組的數組中。 例如。 與一個對象:
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 */
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.