用javascript函数将西里尔语音译为拉丁语

kyn*_*yng 11 javascript transliteration

我做了这个功能:

function transliterate(word){

    var answer = "";

    A = new Array();
    A["?"]="YO";A["?"]="I";A["?"]="TS";A["?"]="U";A["?"]="K";A["?"]="E";A["?"]="N";A["?"]="G";A["?"]="SH";A["?"]="SCH";A["?"]="Z";A["?"]="H";A["?"]="'";
    A["?"]="yo";A["?"]="i";A["?"]="ts";A["?"]="u";A["?"]="k";A["?"]="e";A["?"]="n";A["?"]="g";A["?"]="sh";A["?"]="sch";A["?"]="z";A["?"]="h";A["?"]="'";
    A["?"]="F";A["?"]="I";A["?"]="V";A["?"]="A";A["?"]="P";A["?"]="R";A["?"]="O";A["?"]="L";A["?"]="D";A["?"]="ZH";A["?"]="E";
    A["?"]="f";A["?"]="i";A["?"]="v";A["?"]="a";A["?"]="p";A["?"]="r";A["?"]="o";A["?"]="l";A["?"]="d";A["?"]="zh";A["?"]="e";
    A["?"]="YA";A["?"]="CH";A["?"]="S";A["?"]="M";A["?"]="I";A["?"]="T";A["?"]="'";A["?"]="B";A["?"]="YU";
    A["?"]="ya";A["?"]="ch";A["?"]="s";A["?"]="m";A["?"]="i";A["?"]="t";A["?"]="'";A["?"]="b";A["?"]="yu";

for (i in word){

    if (A[word[i]] === 'undefined'){
        answer += word[i];
        }
    else {
        answer += A[word[i]];
        }

return answer;
}
}
Run Code Online (Sandbox Code Playgroud)

现在它应该将西里尔文本音译为拉丁语,让拉丁语简单地通过.但是它只能设法在第一个音译之后进行音译,而在拉丁语的情况下它会给出未定义的答案.任何人都可以给我一个想法,我做错了什么?

Spl*_*ity 43

几件事......

  1. 使用undefined而不是'undefined'
  2. 不要把回报放在循环中
  3. 使用hasOwnProperty过滤掉原型上的函数和属性
  4. 使用[]代替新的Array()
  5. 使用{}而不是[]
  6. 使用小写变量而不是大写.大写字母保留给构造函数

这是代码

function transliterate(word){
    var answer = ""
      , a = {};

   a["?"]="YO";a["?"]="I";a["?"]="TS";a["?"]="U";a["?"]="K";a["?"]="E";a["?"]="N";a["?"]="G";a["?"]="SH";a["?"]="SCH";a["?"]="Z";a["?"]="H";a["?"]="'";
   a["?"]="yo";a["?"]="i";a["?"]="ts";a["?"]="u";a["?"]="k";a["?"]="e";a["?"]="n";a["?"]="g";a["?"]="sh";a["?"]="sch";a["?"]="z";a["?"]="h";a["?"]="'";
   a["?"]="F";a["?"]="I";a["?"]="V";a["?"]="a";a["?"]="P";a["?"]="R";a["?"]="O";a["?"]="L";a["?"]="D";a["?"]="ZH";a["?"]="E";
   a["?"]="f";a["?"]="i";a["?"]="v";a["?"]="a";a["?"]="p";a["?"]="r";a["?"]="o";a["?"]="l";a["?"]="d";a["?"]="zh";a["?"]="e";
   a["?"]="Ya";a["?"]="CH";a["?"]="S";a["?"]="M";a["?"]="I";a["?"]="T";a["?"]="'";a["?"]="B";a["?"]="YU";
   a["?"]="ya";a["?"]="ch";a["?"]="s";a["?"]="m";a["?"]="i";a["?"]="t";a["?"]="'";a["?"]="b";a["?"]="yu";

   for (i in word){
     if (word.hasOwnProperty(i)) {
       if (a[word[i]] === undefined){
         answer += word[i];
       } else {
         answer += a[word[i]];
       }
     }
   }
   return answer;
}
Run Code Online (Sandbox Code Playgroud)

功能更强大就是这样......

var a = {"?":"YO","?":"I","?":"TS","?":"U","?":"K","?":"E","?":"N","?":"G","?":"SH","?":"SCH","?":"Z","?":"H","?":"'","?":"yo","?":"i","?":"ts","?":"u","?":"k","?":"e","?":"n","?":"g","?":"sh","?":"sch","?":"z","?":"h","?":"'","?":"F","?":"I","?":"V","?":"a","?":"P","?":"R","?":"O","?":"L","?":"D","?":"ZH","?":"E","?":"f","?":"i","?":"v","?":"a","?":"p","?":"r","?":"o","?":"l","?":"d","?":"zh","?":"e","?":"Ya","?":"CH","?":"S","?":"M","?":"I","?":"T","?":"'","?":"B","?":"YU","?":"ya","?":"ch","?":"s","?":"m","?":"i","?":"t","?":"'","?":"b","?":"yu"};

function transliterate(word){
  return word.split('').map(function (char) { 
    return a[char] || char; 
  }).join("");
}
Run Code Online (Sandbox Code Playgroud)

  • 喜欢功能性的.小巧简洁! (2认同)

Ali*_*dov 13

在我的项目中,我使用这种音译方法:

var transliterate = function(text) {

    text = text
        .replace(/\u0401/g, 'YO')
        .replace(/\u0419/g, 'I')
        .replace(/\u0426/g, 'TS')
        .replace(/\u0423/g, 'U')
        .replace(/\u041A/g, 'K')
        .replace(/\u0415/g, 'E')
        .replace(/\u041D/g, 'N')
        .replace(/\u0413/g, 'G')
        .replace(/\u0428/g, 'SH')
        .replace(/\u0429/g, 'SCH')
        .replace(/\u0417/g, 'Z')
        .replace(/\u0425/g, 'H')
        .replace(/\u042A/g, '')
        .replace(/\u0451/g, 'yo')
        .replace(/\u0439/g, 'i')
        .replace(/\u0446/g, 'ts')
        .replace(/\u0443/g, 'u')
        .replace(/\u043A/g, 'k')
        .replace(/\u0435/g, 'e')
        .replace(/\u043D/g, 'n')
        .replace(/\u0433/g, 'g')
        .replace(/\u0448/g, 'sh')
        .replace(/\u0449/g, 'sch')
        .replace(/\u0437/g, 'z')
        .replace(/\u0445/g, 'h')
        .replace(/\u044A/g, "'")
        .replace(/\u0424/g, 'F')
        .replace(/\u042B/g, 'I')
        .replace(/\u0412/g, 'V')
        .replace(/\u0410/g, 'a')
        .replace(/\u041F/g, 'P')
        .replace(/\u0420/g, 'R')
        .replace(/\u041E/g, 'O')
        .replace(/\u041B/g, 'L')
        .replace(/\u0414/g, 'D')
        .replace(/\u0416/g, 'ZH')
        .replace(/\u042D/g, 'E')
        .replace(/\u0444/g, 'f')
        .replace(/\u044B/g, 'i')
        .replace(/\u0432/g, 'v')
        .replace(/\u0430/g, 'a')
        .replace(/\u043F/g, 'p')
        .replace(/\u0440/g, 'r')
        .replace(/\u043E/g, 'o')
        .replace(/\u043B/g, 'l')
        .replace(/\u0434/g, 'd')
        .replace(/\u0436/g, 'zh')
        .replace(/\u044D/g, 'e')
        .replace(/\u042F/g, 'Ya')
        .replace(/\u0427/g, 'CH')
        .replace(/\u0421/g, 'S')
        .replace(/\u041C/g, 'M')
        .replace(/\u0418/g, 'I')
        .replace(/\u0422/g, 'T')
        .replace(/\u042C/g, "'")
        .replace(/\u0411/g, 'B')
        .replace(/\u042E/g, 'YU')
        .replace(/\u044F/g, 'ya')
        .replace(/\u0447/g, 'ch')
        .replace(/\u0441/g, 's')
        .replace(/\u043C/g, 'm')
        .replace(/\u0438/g, 'i')
        .replace(/\u0442/g, 't')
        .replace(/\u044C/g, "'")
        .replace(/\u0431/g, 'b')
        .replace(/\u044E/g, 'yu');

    return text;
};
Run Code Online (Sandbox Code Playgroud)

运行此示例以进行音译:

transliterate('??????????????????????????????????????????????????????????????????');
Run Code Online (Sandbox Code Playgroud)

我用他们的unicode类似物替换了所有俄语字母(每个字母以\ u开头)来解决Javascript文件中的编码问题.

为了检查执行速度,我对这个问题给出了最佳答案,并将其与我的例子进行了比较.我的方法似乎在几次更快(Firebug中的0.16 ms :-).

萤火虫的速度比较

  • ...你在 IE 中开发吗? (7认同)

小智 7

不要使用数组来执行此任务。不要用于for in迭代字符串。不要对照字符串进行检查"undefined"。不要在循环return内for。

\n\n
function transliterate(word) {\n    var A = {};\n    var result = \'\';\n\n    A["\xd0\x81"]="YO";A["\xd0\x99"]="I";A["\xd0\xa6"]="TS";A["\xd0\xa3"]="U";A["\xd0\x9a"]="K";A["\xd0\x95"]="E";A["\xd0\x9d"]="N";A["\xd0\x93"]="G";A["\xd0\xa8"]="SH";A["\xd0\xa9"]="SCH";A["\xd0\x97"]="Z";A["\xd0\xa5"]="H";A["\xd0\xaa"]="\'";\n    A["\xd1\x91"]="yo";A["\xd0\xb9"]="i";A["\xd1\x86"]="ts";A["\xd1\x83"]="u";A["\xd0\xba"]="k";A["\xd0\xb5"]="e";A["\xd0\xbd"]="n";A["\xd0\xb3"]="g";A["\xd1\x88"]="sh";A["\xd1\x89"]="sch";A["\xd0\xb7"]="z";A["\xd1\x85"]="h";A["\xd1\x8a"]="\'";\n    A["\xd0\xa4"]="F";A["\xd0\xab"]="I";A["\xd0\x92"]="V";A["\xd0\x90"]="A";A["\xd0\x9f"]="P";A["\xd0\xa0"]="R";A["\xd0\x9e"]="O";A["\xd0\x9b"]="L";A["\xd0\x94"]="D";A["\xd0\x96"]="ZH";A["\xd0\xad"]="E";\n    A["\xd1\x84"]="f";A["\xd1\x8b"]="i";A["\xd0\xb2"]="v";A["\xd0\xb0"]="a";A["\xd0\xbf"]="p";A["\xd1\x80"]="r";A["\xd0\xbe"]="o";A["\xd0\xbb"]="l";A["\xd0\xb4"]="d";A["\xd0\xb6"]="zh";A["\xd1\x8d"]="e";\n    A["\xd0\xaf"]="YA";A["\xd0\xa7"]="CH";A["\xd0\xa1"]="S";A["\xd0\x9c"]="M";A["\xd0\x98"]="I";A["\xd0\xa2"]="T";A["\xd0\xac"]="\'";A["\xd0\x91"]="B";A["\xd0\xae"]="YU";\n    A["\xd1\x8f"]="ya";A["\xd1\x87"]="ch";A["\xd1\x81"]="s";A["\xd0\xbc"]="m";A["\xd0\xb8"]="i";A["\xd1\x82"]="t";A["\xd1\x8c"]="\'";A["\xd0\xb1"]="b";A["\xd1\x8e"]="yu";\n\n    for(var i = 0; i < word.length; i++) {\n        var c = word.charAt(i);\n\n        result += A[c] || c;\n    }\n\n    return result;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是 jsFiddle 演示。

\n