javascript +动态删除阿拉伯语文本变音符号

时间:2011-03-07 19:30:28

标签: javascript arabic diacritics

如何动态删除阿拉伯语变音符号 我正在设计一个电子书“chm”,并且有多个html页面包含阿拉伯语文本 但是有些时候搜索引擎想突出一些 阿拉伯语单词,因为它的变音符号,所以当页面加载使用JavaScript函数可能会删除阿拉伯语变音文本? 但必须有选项再次启用所以我 不希望从物理上删除它但是暂时的,

问题是我不知道从哪里开始以及使用什么是正确的功能

谢谢你:)

例如

Text : الْحَمْدُ لِلَّهِ رَبِّ الْعَالَمِينَ
converted to : الحمد لله رب العالمين 

6 个答案:

答案 0 :(得分:6)

试试这个

Text : الْحَمْدُ لِلَّهِ رَبِّ الْعَالَمِينَ
converted to : الحمد لله رب العالمين 

http://www.suhailkaleem.com/2009/08/26/remove-diacritics-from-arabic-text-quran/

代码是C#而不是javascript。 还在试图弄清楚如何在javascript中实现这个目标

编辑:显然在javascript中非常容易。 diacratics存储为单独的“字母”,可以很容易地删除它们。

var CHARCODE_SHADDA = 1617;
var CHARCODE_SUKOON = 1618;
var CHARCODE_SUPERSCRIPT_ALIF = 1648;
var CHARCODE_TATWEEL = 1600;
var CHARCODE_ALIF = 1575;

function isCharTashkeel(letter)
{
    if (typeof(letter) == "undefined" || letter == null)
        return false;

    var code = letter.charCodeAt(0);
    //1648 - superscript alif
    //1619 - madd: ~
    return (code == CHARCODE_TATWEEL || code == CHARCODE_SUPERSCRIPT_ALIF || code >= 1612 && code <= 1631); //tashkeel
}

function stripTashkeel(input)
{
  var output = "";
  //todo consider using a stringbuilder to improve performance
  for (var i = 0; i < input.length; i++)
  {
    var letter = input.charAt(i);
    if (!isCharTashkeel(letter)) //tashkeel
      output += letter;                                
  }


return output;                   
}

编辑:这是使用BuckData http://qurandev.github.com/

执行此操作的另一种方法
  

优点   Buck使用较少的带宽在Javascript中,你可以通过搜索   整个巴克古兰经文本在1枪。与阿拉伯语搜索相比直观   降压到阿拉伯语和阿拉伯语到巴克是一个简单的js电话。现场直播   示例:http://jsfiddle.net/BrxJP/您可以删除所有元音   来自巴克文本的几毫秒。为什么这样?你可以搜索   javascript,忽略了taskheel的差异(Fathah,Dammah,   Kasrah)。这导致更多的点击率。正则表达式+降压文本可以导致   令人敬畏的优化。所有搜索都可以在本地运行。   http://qurandev.appspot.com数据如何生成?只是一对一的   使用http://corpus.quran.com/java/buckwalter.jsp

进行映射

答案 1 :(得分:2)

我写了这个函数来处理带有混合阿拉伯语和英语字符的字符串,删除特殊字符(包括变音符号)并规范化一些阿拉伯字符,比如将所有的É转换成ه的。

normalize_text = function(text) {

  //remove special characters
  text = text.replace(/([^\u0621-\u063A\u0641-\u064A\u0660-\u0669a-zA-Z 0-9])/g, '');

  //normalize Arabic
  text = text.replace(/(آ|إ|أ)/g, 'ا');
  text = text.replace(/(ة)/g, 'ه');
  text = text.replace(/(ئ|ؤ)/g, 'ء')
  text = text.replace(/(ى)/g, 'ي');

  //convert arabic numerals to english counterparts.
  var starter = 0x660;
  for (var i = 0; i < 10; i++) {
    text.replace(String.fromCharCode(starter + i), String.fromCharCode(48 + i));
  }

  return text;
}
<input value="الْحَمْدُ لِلَّهِ رَبِّ الْعَالَمِينَ" type="text" id="input">
<button onclick="document.getElementById('input').value = normalize_text(document.getElementById('input').value)">Normalize</button>

答案 2 :(得分:1)

这是一个javascript代码,可以处理几乎所有时间删除阿拉伯语变音符号。

var arabicNormChar = {
    'ك': 'ک', 'ﻷ': 'لا', 'ؤ': 'و', 'ى': 'ی', 'ي': 'ی', 'ئ': 'ی', 'أ': 'ا', 'إ': 'ا', 'آ': 'ا', 'ٱ': 'ا', 'ٳ': 'ا', 'ة': 'ه', 'ء': '', 'ِ': '', 'ْ': '', 'ُ': '', 'َ': '', 'ّ': '', 'ٍ': '', 'ً': '', 'ٌ': '', 'ٓ': '', 'ٰ': '', 'ٔ': '', '�': ''
}

var simplifyArabic  = function (str) {
    return str.replace(/[^\u0000-\u007E]/g, function(a){ 
        var retval = arabicNormChar[a]
        if (retval == undefined) {retval = a}
        return retval; 
    }).normalize('NFKD').toLowerCase();
}

//now you can use simplifyArabic(str) on Arabic strings to remove the diacritics
  

注意:您可以根据自己的喜好覆盖arabicNormChar。

答案 3 :(得分:1)

使用此正则表达式捕获所有tashkeel

[-ؚٟ]

答案 4 :(得分:0)

This site有一些Javascript Unicode规范化的例程,可以用来做你正在尝试的事情。如果没有别的,它可以提供一个良好的起点。

如果您可以预处理数据,Python具有良好的Unicode例程,可以轻松完成这些类型的转换。如果您可以预处理CHM文件以生成单独的索引文件,然后将其合并到CHM中,这可能是一个不错的选择:

import unicodedata

def _strip(text):
    return ''.join([c for c in unicodedata.normalize('NFD', text) \
        if unicodedata.category(c) != 'Mn'])

composed = u'\xcd\xf1\u0163\u0115\u0155\u0148\u0101\u0163\u0129\u014d' \
    u'\u0146\u0105\u013c\u012d\u017e\u0119'

_strip(composed)
'Internationalize'

答案 5 :(得分:0)

我尝试了以下解决方案,效果很好:

const str = 'الْحَمْدُ لِلَّهِ رَبِّ الْعَالَمِينَ';
const withoutDiacs = str.replace(/([^\u0621-\u063A\u0641-\u064A\u0660-\u0669a-zA-Z 0-9])/g, '');
console.log(withoutDiacs); //الحمد لله رب العالمين
参考:https://www.overdoe.com/javascript/2020/06/18/arabic-diacritics.html