Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   русские буквы в шифре Атбаш (https://javascript.ru/forum/misc/27630-russkie-bukvy-v-shifre-atbash.html)

StelZ 19.04.2012 18:08

русские буквы в шифре Атбаш
 
данный скрипт должен переводить букву на противоположную в алфавите(а->я, б->ю и т.д.), но работает это только для английского алфавита. как сделать, чтобы работало с русским?

Код:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=windows-1251">
<title>Шифр Атбаш</title>
</head>
<td>&nbspШифр Атбаш</td>
<body>
<script language="JavaScript">
function atbash(str) {
var ret = '';
for (i=0;i<str.length;i++) {
ret += String.fromCharCode( -  str[i].toUpperCase().charCodeAt(0));
}
return ret;
}
function solve(str) {
document.getElementById('atbash').innerHTML = atbash(str);
}
</script>
<table>
<tbody>
<td><input type="text" onkeyup="solve(this.value);" /></td>
<td id="atbash">&nbsp;</td>
</tbody>
</table>
</body>
</html>


Octane 19.04.2012 19:01

Этот код вообще нерабочий, в JavaScript строки в юникоде, код буквы «а» 1072, какой символ вы ожидаете получить от кода -1072?

Тут либо словарь замен составлять:
<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>…</title>
	<style>
	</style>
</head>
<body>
	<input id="source-text" type="text">
	<input id="encoded-text" type="text">
	<script>
		var source = document.getElementById("source-text"),
			encoded = document.getElementById("encoded-text"),
			replacements = {
				"А": "Я",
				"Б": "Э",
				"В": "Ю",
				"Г": "Ь",
				"Д": "Ы",
				"Е": "Ъ",
				"Ё": "Щ",
				"Ж": "Ш",
				"З": "Ч",
				"И": "Ц",
				"Й": "Х",
				"К": "Ф",
				"Л": "У",
				"М": "Т",
				"Н": "С",
				"О": "Р",
				"П": "П",
				"Р": "О",
				"С": "Н",
				"Т": "М",
				"У": "Л",
				"Ф": "К",
				"Х": "Й",
				"Ц": "И",
				"Ч": "З",
				"Ш": "Ж",
				"Щ": "Ё",
				"Ъ": "Е",
				"Ы": "Д",
				"Ь": "Г",
				"Э": "В",
				"Ю": "Б",
				"Я": "А"
			};
		source.onkeyup = function encode() {
			encoded.value = source.value.replace(/[а-яА-ЯёЁ]/g, function (letter) {
				return replacements[letter.toUpperCase()];
			});
		};
	</script>
</body>
</html>


либо массив букв и заменять по следующему правилу:
Цитата:

Сообщение от http://ru.wikipedia.org/wiki/Атбаш
Правило шифрования состоит в замене «i»-й буквы алфавита буквой с номером «n» − «i» + 1, где «n» — число букв в алфавите.


StelZ 19.04.2012 20:02

моя ошибка, пропустил число, с ним всё работает отлично:
ret += String.fromCharCode(155 - str[i].toUpperCase().charCodeAt(0));

странно, на чистой html странице ваш код не работает. сменил кодировку на windows-1251 и всё заработало. не потому ли, что utf-8 не поддерживает русский?


Часовой пояс GMT +3, время: 15:19.