Javascript 多字符集替换问题

Javascript 多字符集替换问题,javascript,text,replace,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 =

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

  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')));
我谨此陈辞:

۳۲3۴۵

为什么??js如何解析此文本

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


编辑:我的功能代码有错误
en2fa()
已编辑。

默认情况下,
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);
}
var en2faDict={};
var fa2end={};
拆分(“”)。forEach(函数(fa,en){
en=”“+en;
en2faDict[en]=fa;
fa2结果[fa]=en;
});
en2faDict.low='0'。字符编码为(0);
en2faDict.high='9'。字符编码为(0);
fa2enDict.low=en2adict['0'].charCodeAt(0);
fa2enDict.high=en2adict['9'].charCodeAt(0);
函数转换(str,dict){
变量i,l=str.length,结果=”;
对于(i=0;i如果(str.charCodeAt(i)>=dict.low&&str.charCodeAt(i)默认情况下,
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);
}
var en2faDict={};
var fa2end={};
拆分(“”)。forEach(函数(fa,en){
en=”“+en;
en2faDict[en]=fa;
fa2结果[fa]=en;
});
en2faDict.low='0'。字符编码为(0);
en2faDict.high='9'。字符编码为(0);
fa2enDict.low=en2adict['0'].charCodeAt(0);
fa2enDict.high=en2adict['9'].charCodeAt(0);
函数转换(str,dict){
变量i,l=str.length,结果=”;
对于(i=0;i如果(str.charCodeAt(i)>=dict.low&&str.charCodeAt(i)根据您问题中的线索,您的问题在于您进行替换的方式。
您向我们展示了
fa2en
,我认为您的
en2fa
是类似的。但是,更好且有效的实现方式如下所示:

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

您的主要问题如@tom在代码中所述,使用字符串替换仅替换第一次出现的问题。@tom的答案可能不标准。要替换所有出现的问题,您应该使用
regExp
替换为
g
修饰符。这也会导致代码明显缩短!

从您代码中的线索中可以看出问题,你的问题在于你做替换的方式。 您向我们展示了
fa2en
,我认为您的
en2fa
是类似的。但是,更好且有效的实现方式如下所示:

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


您的主要问题正如@tom在代码中所描述的那样,使用字符串替换只替换第一次出现的内容。@tom的回答可能不标准。要替换所有出现的内容,您应该使用
regExp
替换为
g
修饰符。这也会导致代码明显缩短!

您能给我们看一下实施
en2fa(..)
?您发布了
fa2en(..)
。此问题的标题与内容完全无关。将来访问此网站时遇到相同问题的访问者将永远无法找到此问题,而对缩进有疑问的访问者将看到此问题并浪费时间。请澄清
en2fa
的内容(您没有显示它,只有
fa2en
)你能给我们展示一下en2fa(..)的实现吗?你发布了fa2en(..)
。此问题的标题与内容完全无关。将来访问此网站时遇到相同问题的访问者将永远无法找到此问题,而对缩进有疑问的访问者将看到此问题并浪费时间。请澄清
en2fa
的内容(您没有显示它,只有
fa2en
)MDN这样说是关于要替换的第三个参数:
一个指定正则表达式标志组合的字符串。在string.replace方法中使用flags参数是非标准的。与其使用此参数,不如使用带有相应标志的RegExp对象。
@谢谢@HBP。我将更新我的答案。实际上我不知道直到我在Chrome上试用了你的代码,令我惊讶的是,它的性能和你说的一样。这让我急忙想找出原因;-)MDN这样说是关于要替换的第三个参数:
一个指定正则表达式标志组合的字符串。在string.replace方法中使用flags参数是非标准的。与其使用此参数,不如使用带有相应标志的RegExp对象。
@谢谢@HBP。我将更新我的答案。实际上我不知道直到我在Chrome上试用了你的代码,令我惊讶的是,它的性能和你说的一样。这让我急忙想找出原因;-)+1显然是最优雅的解决方案,也可能是最有效的解决方案。@Sebas有趣的是,使用对象而不是字符串将性能提高一倍:@tom,酷!这就是为什么我坚持使用“可能”:-)事实上,正则表达式并不是最快的替换方法。@Sebas在Chrome regex上确实比for loop慢得多,但在Firefox中正好相反。非常有趣。@hbp谢谢,但你的答案只是针对en2fa数字。用其他字符替换任何字符并不流行(我认为)。但对于en2fa来说是完美的:)感谢+1提供了显然是最优雅的解决方案,而且可能也是最有效的解决方案。@Sebas有趣的是,使用对象而不是字符串可以使性能加倍:@tom,酷!这就是我坚持使用“可能”的原因:-)事实上,正则表达式并不是最快的替换方法。@Sebas在Chrome正则表达式上的替换速度确实非常快