Скрипт перекодировки с utf-8 на windows-1251
Возникла необходимость перекодировать при помощи javascript с utf-8 на windows-1251, после того как у меня на странице вылезли "кракозябры", так как получал текст и ссылки на страницу в utf-8, а у меня страница в кодировке windows-1251.
Перерыв, на протяжении нескольких часов, Интернет не нашел ни одного скрипта на javascript для перекодировки с utf-8. Пришлось сотворить скрипт самому. Может окажется для кого-нибудь полезным.
<script type="text/javascript"
>function utf8_decode(s) { var s_list = new Object(); s_list["110561032"] = 1059;s_list["110571027"] = 1089; s_list["110578218"] = 1090;s_list["11056176"] = 1072; s_list["110561030"] = 1074;s_list["110561038"] = 1057; s_list["110561119"] = 1055;s_list["110561113"] = 1050; s_list["110571026"] = 1088;s_list["110561109"] = 1086; s_list["110568212"] = 1047;s_list["110561111"] = 1087; s_list["11056181"] = 1077;s_list["11056177"] = 1073; s_list["11056187"] = 1083;s_list["110571039"] = 1103; s_list["110561112"] = 1084;s_list["110571036"] = 1101; s_list["110561108"] = 1082;s_list["110561105"] = 1080; s_list["110578225"] = 1095;s_list["110561029"] = 1085; s_list["110571107"] = 1091;s_list["11056182"] = 1078; s_list["110571034"] = 1100;s_list["110568250"] = 1051; s_list["110578249"] = 1099;s_list["11056183"] = 1079; s_list["110568470"] = 1081;s_list["110561116"] = 1053; s_list["110561118"] = 1058;s_list["110561110"] = 1075; s_list["1105632"] = 1056;s_list["11056160"] = 1056; s_list["110578224"] = 1094;s_list["110561106"] = 1040; s_list["110561169"] = 1076;s_list["11056152"] = 1048; s_list["110578364"] = 1096;s_list["110578230"] = 1093; s_list["110578240"] = 1097;s_list["110568221"] = 1044; s_list["110571035"] = 1102;s_list["11056164"] = 1060; s_list["110571033"] = 1098;s_list["110578222"] = 1092; s_list["11056167"] = 1063;s_list["11056173"] = 1069; s_list["110568217"] = 1042;s_list["110561115"] = 1054; s_list["110568226"] = 1045;s_list["110578216"] = 1105; s_list["110568216"] = 1041;s_list["110561028"] = 1066; s_list["110568220"] = 1043;s_list["11056171"] = 1067; s_list["110568211"] = 1046;s_list["11056172"] = 1068; s_list["110568482"] = 1049;s_list["11056174"] = 1070; s_list["110561114"] = 1052;s_list["110561031"] = 1071; s_list["11056166"] = 1062;s_list["110561027"] = 1025; s_list["110561025"] = 1064;s_list["110561168"] = 1061; s_list["11056169"] = 1065;s_list["номер3байта"] = 8470; s_list["тире3байта"] = 8211; var L = [] for (var i=0;i
<s.length; i++){ var ord = s.charCodeAt(i); if((s.length-i)>=2){ if ((ord==1074)&&(s.charCodeAt(i+1)==8222)&&(s.charCodeAt(i+2)==8211)){i=i+2; ord='номер3байта'; L.push(String.fromCharCode(s_list[ord]))}} if((s.length-i)>=2){ if ((ord==1074)&&(s.charCodeAt(i+1)==1026)&&(s.charCodeAt(i+2)==8220)){i=i+2; ord='тире3байта'; L.push(String.fromCharCode(s_list[ord]))}} if (ord<297){L.push(String.fromCharCode(ord))}else if ((ord!='номер3байта')&&(ord!='тире3байта')){ i++ ord='1'+ord+s.charCodeAt(i) if (s_list[ord]== undefined) {L.push(String.fromCharCode(63))}else{ L.push(String.fromCharCode(s_list[ord]))}}} return L.join('') }
</script
>
Функция вызывается с передачей в качестве параметра строки с "кракозябрами" и возвращает читабельную строку. В скрипте перекодируются все буквы русского алфавита, а вместо спецсимволов возвращаются знаки вопроса. Если необходима перекодировка всех символов, то в скрипт добавьте код вида:
s_list["1ххххуууу"] = zzzz; где:
xxxx-десятичный код первого символа utf-8
уууу-десятичный код второго символа utf-8
zzzz-десятичный код соответствующего символа windows-1251
Кроме этого необходимо учитывать, что в "кракозябре" есть еще знаки закодированные тремя символами. Для примера в скрипте перекодируются еще знаки № (номер) и - (короткое тире). Если скрипт встретит другой код из трех символов, то он собьётся в декодировании, так как будет считать по два символа. При такой ситуации в скрипте нужны изменения по аналоги с номером и тире.
P.S. Если строка не декодируется в читабельный текст, перед декодированием попробуйте отбросить первый символ "кракозябры" (если не поможет, то и второй), так как в "кракозябре" русские буквы закодированы двумя символами (а то и тремя символами), и если начать декодировать с середины символа, то пойдет сдвиг и результат будет не правильным.
Пример использования: сюда можете поместить свою "кракозябру"