多字符集替换问题

时间:2013-06-16 12:27:35

标签: javascript text replace

我有一个将英文数字字符更改为波斯语的功能:

  function en2fa(str){
    string = str.replace('1', '۱');
    string = string.replace('2', '۲');
    string = string.replace('3', '۳');
    string = string.replace('4', '۴');
    string = string.replace('5', '۵');
    string = string.replace('6', '۶');
    string = string.replace('7', '۷');
    string = string.replace('8', '۸');
    string = string.replace('9', '۹');
    string = string.replace('0', '۰');

    return string;
  }

我想知道js将如何进行深入研究:

var a = '12345';
alert(en2fa(a.replace('1', '3')));

我这样说:

  

32345

为什么呢? js如何解析这个文本?

============

编辑:我在功能代码中有错误。 en2fa()已修改。

2 个答案:

答案 0 :(得分:5)

从问题中的线索来看,您的问题与您进行替换的方式有关。 您向我们展示了fa2en,我认为您的en2fa是相似的。然而,更好和有效的实施方案如下:

  function en2fa (str) {
    return str.replace (/\d/g, function (d) {
      return '۰۱۲۳۴۵۶۷۸۹'.charAt (+d);
    });
  }

您的主要问题是@tom在您的代码中所描述的,使用字符串替换仅替换第一次出现。 @tom的答案虽然可行,但并不标准。要替换所有匹配项,您应使用regExp替换为g修饰符。这导致代码明显缩短!

答案 1 :(得分:2)

默认情况下,replace仅替换第一次出现。要替换所有实例,请使用带有g标志的正则表达式:

function en2fa(str){
    string = string.replace(/1/g, '۱');
    string = string.replace(/2/g, '۲');
    // ...
    return string;
}

var a = '12345';
alert(en2fa(a.replace(/1/g, '3')));

您可以使用查找表使翻译更简洁:

var en2faDict = {};
var fa2enDict = {};
"۰۱۲۳۴۵۶۷۸۹".split('').forEach(function(fa, en) {
    en = "" + en;
    en2faDict[en] = fa;
    fa2enDict[fa] = en;
});

function translate(str, dict, pattern) {
    return str.replace(pattern, function(c) { return dict[c]; });
}

function fa2en(str) {
    return translate(str, fa2enDict, /[۰-۹]/g);
}

function en2fa(str) {
    return translate(str, en2faDict, /[0-9]/g);
}

这是一个在某些浏览器中可能更快的版本。它使用for循环和范围检查,它依赖于数字是连续的事实:

var en2faDict = {};
var fa2enDict = {};
"۰۱۲۳۴۵۶۷۸۹".split('').forEach(function(fa, en) {
    en = "" + en;
    en2faDict[en] = fa;
    fa2enDict[fa] = en;
});
en2faDict.low = '0'.charCodeAt(0);
en2faDict.high = '9'.charCodeAt(0);
fa2enDict.low = en2faDict['0'].charCodeAt(0);
fa2enDict.high = en2faDict['9'].charCodeAt(0);

function translate(str, dict) {
    var i, l = str.length, result = "";
    for (i = 0; i < l; i++) {
        if (str.charCodeAt(i) >= dict.low && str.charCodeAt(i) <= dict.high)
            result += dict[str[i]];
        else
            result += str[i];
    }
    return result;
}

function fa2en(str) {
    return translate(str, fa2enDict);
}

function en2fa(str) {
    return translate(str, en2faDict);
}