JavaScript中的巨大字符串替换?

时间:2013-08-14 03:16:47

标签: javascript utf-8 replace windows-1252

我有一个小的JavaScript应用程序,它将解析用户放入浏览器的文件。最近我发现了一些非英语字符的问题。此处删除的文件类型使用的是Windows-1252字符集,因此ñ等字符实际上是ñ,我必须将它们全部转换为正确的字符。

例如,我得到的Señor应为Señor西班牙语。

我找到了一个extremely useful website字符集,以及我需要转换为的字符集。

我把它浓缩成两个JavaScript数组:

var toReplace = ["À", "Ã", "Â", "Ã", "Ä", "Ã…", "Æ", "Ç", "È", "É", "Ê", "Ë", "ÃŒ", "Ã", "ÃŽ", "Ã", "Ã", "Ñ", "Ã’", "Ó", "Ô", "Õ", "Ö", "×", "Ø", "Ù", "Ú", "Û", "Ãœ", "Ã", "Þ", "ß", "Ã", "á", "â", "ã", "ä", "Ã¥", "æ", "ç", "è", "é", "ê", "ë", "ì", "í", "î", "ï", "ð", "ñ", "ò", "ó", "ô", "õ", "ö", "÷", "ø", "ù", "ú", "û", "ü", "ý", "þ", "ÿ"];
var replaceWith = ["À", "Á", "Â", "Ã", "Ä", "Å", "Æ", "Ç", "È", "É", "Ê", "Ë", "Ì", "Í", "Î", "Ï", "Ð", "Ñ", "Ò", "Ó", "Ô", "Õ", "Ö", "×", "Ø", "Ù", "Ú", "Û", "Ü", "Ý", "Þ", "ß", "à", "á", "â", "ã", "ä", "å", "æ", "ç", "è", "é", "ê", "ë", "ì", "í", "î", "ï", "ð", "ñ", "ò", "ó", "ô", "õ", "ö", "÷", "ø", "ù", "ú", "û", "ü", "ý", "þ", "ÿ"];

toReplace中的段落中的所有字符替换为replaceWith中的对应字段(相同索引)的最有效方法是什么?

我希望这不会太沉重,因为将100多个文件放入此应用程序中已经做了一些沉重的循环并且这种情况并不少见。解析。

也许有更好的方法来做这个而不是将这些字符保存在数组中?

编辑 - 我刚才意识到我可能需要替换unicode eqivilent。这是一个以相同顺序的unicode字符数组:

var unicodeReplaceWith= ["\u00C0", "\u00C1", "\u00C2", "\u00C3", "\u00C4", "\u00C5", "\u00C6", "\u00C7", "\u00C8", "\u00C9", "\u00CA", "\u00CB", "\u00CC", "\u00CD", "\u00CE", "\u00CF", "\u00D0", "\u00D1", "\u00D2", "\u00D3", "\u00D4", "\u00D5", "\u00D6", "\u00D7", "\u00D8", "\u00D9", "\u00DA", "\u00DB", "\u00DC", "\u00DD", "\u00DE", "\u00DF", "\u00E0", "\u00E1", "\u00E2", "\u00E3", "\u00E4", "\u00E5", "\u00E6", "\u00E7", "\u00E8", "\u00E9", "\u00EA", "\u00EB", "\u00EC", "\u00ED", "\u00EE", "\u00EF", "\u00F0", "\u00F1", "\u00F2", "\u00F3", "\u00F4", "\u00F5", "\u00F6", "\u00F7", "\u00F8", "\u00F9", "\u00FA", "\u00FB", "\u00FC", "\u00FD", "\u00FE", "\u00FF"];

1 个答案:

答案 0 :(得分:4)

我对JavaScript的速度知之甚少,或者为什么无法在服务器上正确配置,但这是一种方法。

Interactive Demo

首先我们将所有内容都变成一个对象,这样我们就可以查找翻译了。

var map = {};
for (var i=0; i<toReplace.length; i++) {
  map[toReplace[i]] = replaceWith[i];
}

然后我们将我们的密钥加入到正则表达式中 (注意:它们必须按时间排序最长,代码在演示中)。

var expression = new RegExp(toReplace.join("|"), "g");

在替换功能中,我们可以替换匹配结果。这就像在map中查找它们一样简单。

function doReplace(source) {
  return source.replace(expression, function(m) {
    return map[m];
  });
}

var result = doReplace("Señor");