Преобразование из английского языка в арабский на html-странице

Мне нужно преобразовать все английские номера, которые появляются на данной HTML-странице, на арабские (чтобы быть независимыми от кодировки браузера пользователя). Я предпочитаю использовать javascript, или это будет здорово, если это можно обработать с помощью CSS.

Я нашел несколько страниц, но я обнаружил, что арабские буквы добавляются с их представлением ASCII в исходном коде. Означает ли это, что они применяют какую-то функцию java script?

Любая подсказка, как я могу сделать что-то вроде этого?

Ответы

Ответ 1

Как насчет функции прямой замены?

String.prototype.toIndiaDigits= function(){
 var id= ['۰','۱','۲','۳','۴','۵','۶','۷','۸','۹'];
 return this.replace(/[0-9]/g, function(w){
  return id[+w]
 });
}

// test

var S='The year 2009 has only 365 days';
alert(S.toIndiaDigits());

/*  returned value: (String)
The year ۲۰۰۹ has only ۳۶۵ days
*/

Ответ 2

Вам нужно будет использовать JavaScript, но процедура довольно проста. Предполагая, что номер, который вы хотите преобразовать, уже находится в строке, тогда будет выглядеть что-то вроде следующего фрагмента кода:

function convertDigitIn(enDigit){ // PERSIAN, ARABIC, URDO
    var newValue="";
    for (var i=0;i<enDigit.length;i++)
    {
        var ch=enDigit.charCodeAt(i);
        if (ch>=48 && ch<=57)
        {
            // european digit range
            var newChar=ch+1584;
            newValue=newValue+String.fromCharCode(newChar);
        }
        else
            newValue=newValue+String.fromCharCode(ch);
    }
    return newValue;
}

Код не очень красив и, вероятно, может быть написан более эффективно, но в основном он делает преобразование любого char из "0" в "9" путем добавления значения смещения, чтобы теперь значение символа находилось в диапазон Unicode для цифр индикатора. Значения индикаторов варьируются от \u0660 до\u0669, следовательно, преобразование из цифр в европейский в индексы является просто математикой.

Ответ 3

Чтобы объяснить этот комментарий:

Как и в этой ссылке almasry-alyoum.com, когда я просматриваю источник этой страницы, я обнаруживаю, что индийские буквы помещаются в их ascii-представление (т.е. &#1634;&#1635;&#1639;)

Это объекты символов HTML. Значения представляют собой кодовые обозначения Unicode, определенные в документации.

0660 ARABIC-INDIC DIGIT ZERO
0661 ARABIC-INDIC DIGIT ONE
0662 ARABIC-INDIC DIGIT TWO
0663 ARABIC-INDIC DIGIT THREE
0664 ARABIC-INDIC DIGIT FOUR
0665 ARABIC-INDIC DIGIT FIVE
0666 ARABIC-INDIC DIGIT SIX
0667 ARABIC-INDIC DIGIT SEVEN
0668 ARABIC-INDIC DIGIT EIGHT
0669 ARABIC-INDIC DIGIT NINE

So, ٠ ١ ٢ ٣ ٤ ٥ ٦ ٧ ٨ ٩ can be encoded as &#x0660; &#x0661; &#x0662; &#x0663; &#x0664; &#x0665; &#x0666; &#x0667; &#x0668; &#x0669; in a web page.

Примечание: &# для десятичных значений; &#x для hex.

Ответ 4

Спасибо за ответы. Никто не обсуждал обработку десятичных и тысячных маркеров. Посмотрите Википедию например. Согласно этой странице, это правильные символы Юникода:

  • U + 066B - арабский десятичный разделитель
  • U + 066C - арабский разделитель тысяч

Ответ 5

Преобразование английских (латинских) цифр в персидские и арабские цифры.

//English to Persian digits.
String.prototype.toFa= function() {
  return this.replace(/\d/g, d => '۰۱۲۳۴۵۶۷۸۹'[d])
}

//English to Arabic digits.
String.prototype.toAr= function() {
  return this.replace(/\d/g, d =>  '٠١٢٣٤٥٦٧٨٩'[d])
}

//English to either Persian or Arabic digits.
String.prototype.toIn= function(e) {
  return this.replace(/\d/g, d => e ? '٠١٢٣٤٥٦٧٨٩'[d] : '۰۱۲۳۴۵۶۷۸۹'[d])
}

//English to Persian digits using unicode.
String.prototype.toFaUni= function() {
  return this.replace(/\d/g, d => String.fromCharCode('0x06F'+d))
}

//English to Arabic digits using unicode.
String.prototype.toArUni= function() {
  return this.replace(/\d/g, d => String.fromCharCode('0x066'+d))
}

//English to either Persian or Arabic digits.
String.prototype.toInUni= function(e) {
  return this.replace(/\d/g, d => String.fromCharCode('0x06'+(e ? '6':'F')+d))
}

//examples
let text = 'It is 30/08/2018 at 8:24 AM'

//using array
alert(text.toFa())
alert(text.toAr())
alert(text.toIn(0))
alert(text.toIn(1))

//using unicode
alert(text.toFaUni())
alert(text.toArUni())
alert(text.toInUni(0))
alert(text.toInUni(1))

jsfiddle

Ответ 6

"ASCII-эквиваленты", на которые вы ссылаетесь, на самом деле не являются таковыми.

Прежде всего, ASCII представляет собой 7-битную кодировку символов, в которой символы типа Arabic-Indic Digit Two не существуют.

Во-вторых, то, что вы видите, на самом деле HTML-сущности. Чтобы программно сделать преобразование из латинских цифр в эти сущности, потребуется усиление бэкэнд-языка, такого как PHP, Perl, С# и т.д.

В-третьих, числовое значение, представленное в объектах, является их Кодовой точкой Юникода в десятичной форме. Итак, 2 - символ Юникода в кодовой точке 1634 (десятичный) или 0662 (шестнадцатеричный), который является более стандартным обозначением.

Наконец, мне нравится подход ferdley, но сложная часть будет выяснять, как использовать его алгоритм для замены только тех чисел, которые вы хотите, а не числа, которые в противном случае появляются в источнике HTML, такие как ширина пикселя изображения.

Ответ 7

Отредактируйте первый ответ, конвертируйте английские цифры в арабские:

String.prototype.toArabicDigits = function(){
var id = ['٠','١','٢','٣','٤','٥','٦','٧','٨','٩'];
return this.replace(/[0-9]/g, function(w){
  return id[+w];
 });
};