我做了这个功能:
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;
}
}
现在,应该音译西里尔文字拉丁,让拉丁简单地传递。 但它只能管理以后和在拉美的情况下音译第一它给不确定的答案。 谁能给我一个想法,我究竟做错了什么?
Answer 1:
事情情侣...
- 使用未定义的,而不是“未定义”
- 不要把在循环回
- 使用hasOwnProperty过滤掉对样机的功能和性能
- 而不是新阵列中使用[]()
- 使用{}而不是一个[]
- 使用小写变量而不是大写。 大写字母被保留用于构造
下面是代码
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;
}
更多的功能之一是这样的...
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("");
}
Answer 2:
在我的项目,我用音译的这种方法:
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;
};
运行这个样本音译:
transliterate('абвгдеёжзийклмнопрстуфхцчшщъыьэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ');
我已经取代了俄罗斯所有的信件,它们的Unicode类似物(每个字母开头\ U),以解决在Javascript文件编码的问题。
要检查执行速度,我把最好的回答这个问题,并与我的例子进行了比较。 我的方法似乎是在快几倍(在Firebug :-) 0.16毫秒。
Answer 3:
不要使用数组这项任务。 不要使用for in
遍历字符串。 不要对证字符串"undefined"
。 不要return
内for
循环。
function transliterate(word) {
var A = {};
var result = '';
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(var i = 0; i < word.length; i++) {
var c = word.charAt(i);
result += A[c] || c;
}
return result;
}
这是一个示范的jsfiddle。
Answer 4:
您的主要问题是, return
是放错了地方。 这是你的循环内 ,因此它返回的第一次迭代。 将其更改为:
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; // <=== Was *above* the } on the previous line
}
请注意,我已经解决了压痕。 一致的缩进有助于避免这些类型的错误。
注1:有没有什么关于你的A
使用它是一个事实对象Array
。 你只是使用它作为一个地图。 在JavaScript中,所有的对象都对应,因此,而不是A = new Array();
只使用A = {};
。
注2: A
和i
永远不会在你的函数声明,所以你堕入隐全局的恐怖 。 为了解决这个问题,声明他们var
。
注3:无论使用for..in
遍历一个字符串的字符,也没有使用[]
索引到串,是跨越JavaScript引擎可靠。 相反,使用for (i = 0; i < word.length; ++i)
然后ch = word.charAt(i);
在该位置获得该字符,然后用ch
在你的代码内环路。
注4:可以使用奇怪的强大||
运营商缩短你的代码,例如:
answer += A[ch] || ch;
Answer 5:
在JS俄罗斯符号不会在我的系统在所有工作。 我不知道为什么。 所以我用这个下一个代码:
它不仅音译而是“_”和小写的一切替换所有的标点符号。
function translit(str){ var sp = '_'; var text = str.toLowerCase(); var transl = { '\u0430': 'a', '\u0431': 'b', '\u0432': 'v', '\u0433': 'g', '\u0434': 'd', '\u0435': 'e', '\u0451': 'e', '\u0436': 'zh', '\u0437': 'z', '\u0438': 'i', '\u0439': 'j', '\u043a': 'k', '\u043b': 'l', '\u043c': 'm', '\u043d': 'n', '\u043e': 'o', '\u043f': 'p', '\u0440': 'r', '\u0441': 's', '\u0442': 't', '\u0443': 'u', '\u0444': 'f', '\u0445': 'h', '\u0446': 'c', '\u0447': 'ch', '\u0448': 'sh', '\u0449': 'shch', '\u044a': '\'', '\u044b': 'y', '\u044c': '', '\u044d': 'e', '\u044e': 'yu', '\u044f': 'ya', '\u00AB':'_', '\u00BB':'_', // «» ' ': sp, '_': sp, '`': sp, '~': sp, '!': sp, '@': sp, '#': sp, '$': sp, '%': sp, '^': sp, '&': sp, '*': sp, '(': sp, ')': sp, '-': sp, '\=': sp, '+': sp, '[': sp, ']': sp, '\\': sp, '|': sp, '/': sp, '.': sp, ',': sp, '{': sp, '}': sp, '\'': sp, '"': sp, ';': sp, ':': sp, '?': sp, '<': sp, '>': sp, '№': sp } var result = ''; var curent_sim = ''; for(i=0; i < text.length; i++) { if(transl[text[i]] != undefined) { if(curent_sim != transl[text[i]] || curent_sim != sp){ result += transl[text[i]]; curent_sim = transl[text[i]]; } } else { result += text[i]; curent_sim = text[i]; } } result = result.replace(/^_/, '').replace(/_$/, ''); // trim return result } var result = translit('Привет Мир!'); document.getElementById('alias').value = result;
<html> <body> <input name="name" type="text" id="alias" /> </body> </html>
该代码最初被带到这里: http://ajaxs.ru/lesson/js/137-transliteracija_stroki_na_javascript.html ,然后重构。
Answer 6:
通过结合巴特Riemens和TJ克劳德的建议,我想出了这个代码,该接缝很好做的伎俩:
function transliterate(word){
var answer = "";
var 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 = 0; i < word.length; ++i){
answer += a[word[i]] === undefined ? word[i] : a[word[i]];
}
return answer;
}
比你!
文章来源: transliterating cyrillic to latin with javascript function