2012-07-09 19 views
8

tôi đã thực hiện chức năng này:chuyển ngữ Cyrillic để Latin với javascript chức năng

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; 
} 
} 

Bây giờ nó nên transliterate văn bản Cyrillic để Latin và để Latin chỉ đơn giản là vượt qua. Nhưng nó chỉ quản lý để phiên âm đầu tiên sau đó và trong trường hợp của latin nó cho undefined như là một câu trả lời. Bất cứ ai có thể cho tôi một ý tưởng, tôi đang làm gì sai?

+0

Một ide? Như trong môi trường phát triển _integrated_ hoặc _idea_? – Daedalus

Trả lời

39

Vài điều ...

  1. Sử dụng undefined thay vì 'undefined'
  2. Đừng đặt sự trở lại trong vòng lặp
  3. Sử dụng hasOwnProperty để lọc các hàm và thuộc tính trên mẫu thử nghiệm
  4. Sử dụng [] thay vì mảng mới()
  5. Sử dụng {} thay vì []
  6. Sử dụng biến trường hợp thấp hơn thay vì chữ thường.Hoa được dành riêng cho nhà xây dựng

Đây là mã

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; 
} 

One More chức năng là như thế này ...

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(""); 
} 
+0

Tôi thấy bản thân mình xem lại câu hỏi này mọi lúc và sau đó và tôi khá chắc chắn đây là nhỏ gọn nhất và mã có thể sử dụng giải quyết vấn đề này người ta sẽ tìm ra ở đó. Cảm ơn! – tftd

+2

Thích một chức năng. Nhỏ gọn và súc tích! – Faramarz

+0

Xin chào, bạn có biết liệu có thư viện nào không? (sẽ cần nó cho bảng chữ cái khác quá) – franck

2

Vấn đề chính của bạn là return ở sai vị trí. Đó là bên trong vòng lặp của bạn, vì vậy nó sẽ trả về lần lặp đầu tiên. Thay đổi nó thành:

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 
} 

Lưu ý rằng tôi đã cố định thụt đầu dòng. Chấm lõm nhất quán giúp bạn tránh được các loại lỗi này.


Lưu ý 1: Có về đối tượng A của bạn có sử dụng thực tế nó là một Array. Bạn chỉ sử dụng nó như một bản đồ. Trong JavaScript, tất cả các đối tượng là bản đồ, vì vậy thay vì A = new Array(); chỉ cần sử dụng A = {};.

Lưu ý 2: Ai không bao giờ được khai báo trong chức năng của bạn, vì vậy bạn đang rơi con mồi đến The Horror of Implicit Globals. Để khắc phục, hãy khai báo chúng với var.

Lưu ý 3: Không sử dụng for..in để lặp qua các ký tự của chuỗi, cũng không sử dụng [] để lập chỉ mục vào chuỗi, đáng tin cậy trên các công cụ JavaScript. Thay vào đó, hãy sử dụng for (i = 0; i < word.length; ++i) và sau đó ch = word.charAt(i); để lấy ký tự ở vị trí đó, sau đó sử dụng ch trong mã của bạn trong vòng lặp.

Lưu ý 4: Bạn có thể sử dụng để rút ngắn Curiously powerful || operator mã của bạn, ví dụ .:

answer += A[ch] || ch; 
3

Không sử dụng một mảng cho nhiệm vụ này. Không sử dụng for in để lặp lại chuỗi. Đừng kiểm tra chuỗi "undefined". Không return trong vòng lặp 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; 
} 

Here is a jsFiddle demonstration.

+0

Không đặt 'var i' vào cấu trúc vòng lặp. Không đặt 'var c' vào phần thân vòng lặp. Lý do: [* Nghèo, hiểu sai 'var' *] (http://blog.niftysnippets.org/2008/03/poor-misunderstood-var.html) +1 nếu không –

+0

@TJCrowder: Tôi biết rằng nó định nghĩa chúng là một phạm vi chức năng, và tôi hoàn toàn hài lòng với thực tế. Nó chỉ đơn giản là một quy ước mã hóa. Cảm ơn bạn mặc dù. –

+0

@ Charmander: Một cái xấu. Nếu bạn muốn chủ động lừa dối những người duy trì mã của bạn, mặc dù, bằng mọi cách tiếp tục. ;-) (Lưu ý rằng 'let' đang đến với JavaScript, điều này chỉ làm cho việc sử dụng' var' trở nên bấp bênh hơn.) –

0

Bằng cách kết hợp kiến ​​nghị của Bart Riemens và T.J. Đám đông tôi đã đưa ra mã này, các đường nối để thực hiện thủ thuật độc đáo:

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; 
} 

Hơn bạn!

+1

Cool! Bạn có thấy phiên bản chức năng mới nhất của tôi không! :-) –

+0

@Bart Riemens Đã không nhận thấy nó lúc đầu, nhưng nó đường nối ngắn hơn và phổ quát hơn. – kyng

1

Ký hiệu tiếng Nga trong js không hoạt động ở hệ thống của tôi. Tôi không biết tại sao. Vì vậy, tôi sử dụng mã tiếp theo cho việc này:

Nó sẽ không chỉ chuyển ngữ mà còn thay thế tất cả các dấu chấm câu bằng '_' và chữ thường.

function translit(str){ 
 
\t var sp = '_'; 
 
\t var text = str.toLowerCase(); 
 
\t var transl = { 
 
\t \t '\u0430': 'a', '\u0431': 'b', '\u0432': 'v', '\u0433': 'g', '\u0434': 'd', '\u0435': 'e', '\u0451': 'e', '\u0436': 'zh', 
 
\t \t '\u0437': 'z', '\u0438': 'i', '\u0439': 'j', '\u043a': 'k', '\u043b': 'l', '\u043c': 'm', '\u043d': 'n', '\u043e': 'o', 
 
\t \t '\u043f': 'p', '\u0440': 'r', '\u0441': 's', '\u0442': 't', '\u0443': 'u', '\u0444': 'f', '\u0445': 'h', '\u0446': 'c', 
 
\t \t '\u0447': 'ch', '\u0448': 'sh', '\u0449': 'shch', '\u044a': '\'', '\u044b': 'y', '\u044c': '', '\u044d': 'e', '\u044e': 'yu', 
 
\t \t '\u044f': 'ya', \t \t 
 
\t \t '\u00AB':'_', '\u00BB':'_', // «» 
 
\t \t ' ': sp, '_': sp, '`': sp, '~': sp, 
 
\t \t '!': sp, '@': sp, '#': sp, '$': sp, 
 
\t \t '%': sp, '^': sp, '&': sp, '*': sp, '(': sp, ')': sp, '-': sp, '\=': sp, 
 
\t \t '+': sp, '[': sp, ']': sp, '\\': sp, '|': sp, '/': sp, '.': sp, ',': sp, 
 
\t \t '{': sp, '}': sp, '\'': sp, '"': sp, ';': sp, ':': sp, '?': sp, '<': sp, 
 
\t \t '>': sp, '№': sp \t \t \t \t \t 
 
\t } 
 
    var result = ''; 
 
\t var curent_sim = ''; 
 
    for(i=0; i < text.length; i++) { 
 
\t \t if(transl[text[i]] != undefined) { \t \t \t 
 
\t \t \t if(curent_sim != transl[text[i]] || curent_sim != sp){ 
 
\t \t \t \t result += transl[text[i]]; 
 
\t \t \t \t curent_sim = transl[text[i]]; \t \t \t \t 
 
\t \t \t } \t \t \t \t \t 
 
\t \t } else { 
 
\t \t \t result += text[i]; 
 
\t \t \t curent_sim = text[i]; 
 
\t \t } \t \t 
 
    } 
 
\t result = result.replace(/^_/, '').replace(/_$/, ''); // trim 
 
\t return result 
 
} 
 

 
var result = translit('Привет Мир!'); 
 
document.getElementById('alias').value = result;
<html> 
 
    <body> 
 
    <input name="name" type="text" id="alias" /> 
 
    </body> 
 
</html>

Mã này ban đầu được đưa ra ở đây: http://ajaxs.ru/lesson/js/137-transliteracija_stroki_na_javascript.html và sau đó refactored.

3

Trong các dự án của tôi, tôi đang sử dụng phương pháp này chuyển ngữ:

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 mẫu này để transliterate:

transliterate('абвгдеёжзийклмнопрстуфхцчшщъыьэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ'); 

tôi đã thay thế tất cả các chữ Nga với chất tương tự unicode của họ (mỗi chữ cái bắt đầu bằng \ u) để giải quyết các vấn đề với mã hóa trong tệp Javascript.

Để kiểm tra tốc độ thực thi, tôi đã lấy câu trả lời đúng nhất cho câu hỏi này và so sánh nó với ví dụ của tôi. Phương pháp của tôi dường như nhanh hơn trong vài lần (0,16 ms trong Firebug :-).

speed comparison in firebug

+1

Giải pháp tốt, cảm ơn! – Kholiavko

Các vấn đề liên quan