Время на прочтение
5 мин
Количество просмотров 22K
Есть у меня старый сайт на Народ.Ру, и недавно я закинул туда несколько статей — как это я теперь делаю в UTF-8. Кодировка была указана в теге meta
, но, взглянув на страницы, я увидел крякозябры: «Р§С‚Рѕ-то случилось.
» Оказывается, Народ.Ру шлёт HTTP-заголовок Content-Type: text/html; charset=windows-1251
и это на нём никак не отключается. Пользователь может получить читабельный текст — только если догадается вручную переключить кодировку в браузере.
Что делать? Переходить на другой хостинг? Само собой, но пока руки не дошли, хотелось добиться результата тут. Перекодировать тексты? Более достойным и интересным показалось поставить Javascript-«заплатку».
Способа переключить кодировку из Javascript я не нашёл. Остался вариант перекодировать текст скриптом, запускаемым по событию onready
документа.
Итак, браузер получает текст в UTF-8, разбивает UTF-последовательности на группы по 8 бит и трактует их как коды символов в кодировке Windows-1251. Чтобы восстановить читаемость текста, нужно получить эти коды, объединить их в UTF-последовательности, а из них — восстановить Unicode-коды символов и вернуть последние посредством числовых ссылок HTML на символы. В этом деле обнаружились несколько закавык.
Во-первых, считывая текст из свойства innerHTML
, мы обнаруживаем на месте неразрывного пробела (0xA0) HTML-сущность «
». Нужно её заменять обратно на 0xA0
.
Во-вторых, функция charCodeAt
возвращает код символа в Unicode, а не в Windows-1251, значит нужно преобразовывать первый во второй. В-третьих, символа с кодом 0x98
в Windows-1251 нет, так что эта функция возвращает для него undefined
, это нужно предусмотреть.
В-четвёртых, Internet Explorer и Safari не позволяют поменять заголовок документа через DOM, только через соответствующее свойство документа — но туда нельзя писать числовые ссылки HTML. Для этого случая можно переводить Unicode-коды в шестнадцатеричную систему счисления, записывать их в виде «%код» и пропускать через функцию unescape
.
Итоговый код получается таким:
bindReady(
function(){
var Win1251 =
{
0x0: 0x0,
0x1: 0x1,
0x2: 0x2,
0x3: 0x3,
0x4: 0x4,
0x5: 0x5,
0x6: 0x6,
0x7: 0x7,
0x8: 0x8,
0x9: 0x9,
0xA: 0xA,
0xB: 0xB,
0xC: 0xC,
0xD: 0xD,
0xE: 0xE,
0xF: 0xF,
0x10: 0x10,
0x11: 0x11,
0x12: 0x12,
0x13: 0x13,
0x14: 0x14,
0x15: 0x15,
0x16: 0x16,
0x17: 0x17,
0x18: 0x18,
0x19: 0x19,
0x1A: 0x1A,
0x1B: 0x1B,
0x1C: 0x1C,
0x1D: 0x1D,
0x1E: 0x1E,
0x1F: 0x1F,
0x20: 0x20,
0x21: 0x21,
0x22: 0x22,
0x23: 0x23,
0x24: 0x24,
0x25: 0x25,
0x26: 0x26,
0x27: 0x27,
0x28: 0x28,
0x29: 0x29,
0x2A: 0x2A,
0x2B: 0x2B,
0x2C: 0x2C,
0x2D: 0x2D,
0x2E: 0x2E,
0x2F: 0x2F,
0x30: 0x30,
0x31: 0x31,
0x32: 0x32,
0x33: 0x33,
0x34: 0x34,
0x35: 0x35,
0x36: 0x36,
0x37: 0x37,
0x38: 0x38,
0x39: 0x39,
0x3A: 0x3A,
0x3B: 0x3B,
0x3C: 0x3C,
0x3D: 0x3D,
0x3E: 0x3E,
0x3F: 0x3F,
0x40: 0x40,
0x41: 0x41,
0x42: 0x42,
0x43: 0x43,
0x44: 0x44,
0x45: 0x45,
0x46: 0x46,
0x47: 0x47,
0x48: 0x48,
0x49: 0x49,
0x4A: 0x4A,
0x4B: 0x4B,
0x4C: 0x4C,
0x4D: 0x4D,
0x4E: 0x4E,
0x4F: 0x4F,
0x50: 0x50,
0x51: 0x51,
0x52: 0x52,
0x53: 0x53,
0x54: 0x54,
0x55: 0x55,
0x56: 0x56,
0x57: 0x57,
0x58: 0x58,
0x59: 0x59,
0x5A: 0x5A,
0x5B: 0x5B,
0x5C: 0x5C,
0x5D: 0x5D,
0x5E: 0x5E,
0x5F: 0x5F,
0x60: 0x60,
0x61: 0x61,
0x62: 0x62,
0x63: 0x63,
0x64: 0x64,
0x65: 0x65,
0x66: 0x66,
0x67: 0x67,
0x68: 0x68,
0x69: 0x69,
0x6A: 0x6A,
0x6B: 0x6B,
0x6C: 0x6C,
0x6D: 0x6D,
0x6E: 0x6E,
0x6F: 0x6F,
0x70: 0x70,
0x71: 0x71,
0x72: 0x72,
0x73: 0x73,
0x74: 0x74,
0x75: 0x75,
0x76: 0x76,
0x77: 0x77,
0x78: 0x78,
0x79: 0x79,
0x7A: 0x7A,
0x7B: 0x7B,
0x7C: 0x7C,
0x7D: 0x7D,
0x7E: 0x7E,
0x7F: 0x7F,
0x402: 0x80,
0x403: 0x81,
0x201A: 0x82,
0x453: 0x83,
0x201E: 0x84,
0x2026: 0x85,
0x2020: 0x86,
0x2021: 0x87,
0x20AC: 0x88,
0x2030: 0x89,
0x409: 0x8A,
0x2039: 0x8B,
0x40A: 0x8C,
0x40C: 0x8D,
0x40B: 0x8E,
0x40F: 0x8F,
0x452: 0x90,
0x2018: 0x91,
0x2019: 0x92,
0x201C: 0x93,
0x201D: 0x94,
0x2022: 0x95,
0x2013: 0x96,
0x2014: 0x97,
0x2122: 0x99,
0x459: 0x9A,
0x203A: 0x9B,
0x45A: 0x9C,
0x45C: 0x9D,
0x45B: 0x9E,
0x45F: 0x9F,
0xA0: 0xA0,
0x40E: 0xA1,
0x45E: 0xA2,
0x408: 0xA3,
0xA4: 0xA4,
0x490: 0xA5,
0xA6: 0xA6,
0xA7: 0xA7,
0x401: 0xA8,
0xA9: 0xA9,
0x404: 0xAA,
0xAB: 0xAB,
0xAC: 0xAC,
0xAD: 0xAD,
0xAE: 0xAE,
0x407: 0xAF,
0xB0: 0xB0,
0xB1: 0xB1,
0x406: 0xB2,
0x456: 0xB3,
0x491: 0xB4,
0xB5: 0xB5,
0xB6: 0xB6,
0xB7: 0xB7,
0x451: 0xB8,
0x2116: 0xB9,
0x454: 0xBA,
0xBB: 0xBB,
0x458: 0xBC,
0x405: 0xBD,
0x455: 0xBE,
0x457: 0xBF,
0x410: 0xC0,
0x411: 0xC1,
0x412: 0xC2,
0x413: 0xC3,
0x414: 0xC4,
0x415: 0xC5,
0x416: 0xC6,
0x417: 0xC7,
0x418: 0xC8,
0x419: 0xC9,
0x41A: 0xCA,
0x41B: 0xCB,
0x41C: 0xCC,
0x41D: 0xCD,
0x41E: 0xCE,
0x41F: 0xCF,
0x420: 0xD0,
0x421: 0xD1,
0x422: 0xD2,
0x423: 0xD3,
0x424: 0xD4,
0x425: 0xD5,
0x426: 0xD6,
0x427: 0xD7,
0x428: 0xD8,
0x429: 0xD9,
0x42A: 0xDA,
0x42B: 0xDB,
0x42C: 0xDC,
0x42D: 0xDD,
0x42E: 0xDE,
0x42F: 0xDF,
0x430: 0xE0,
0x431: 0xE1,
0x432: 0xE2,
0x433: 0xE3,
0x434: 0xE4,
0x435: 0xE5,
0x436: 0xE6,
0x437: 0xE7,
0x438: 0xE8,
0x439: 0xE9,
0x43A: 0xEA,
0x43B: 0xEB,
0x43C: 0xEC,
0x43D: 0xED,
0x43E: 0xEE,
0x43F: 0xEF,
0x440: 0xF0,
0x441: 0xF1,
0x442: 0xF2,
0x443: 0xF3,
0x444: 0xF4,
0x445: 0xF5,
0x446: 0xF6,
0x447: 0xF7,
0x448: 0xF8,
0x449: 0xF9,
0x44A: 0xFA,
0x44B: 0xFB,
0x44C: 0xFC,
0x44D: 0xFD,
0x44E: 0xFE,
0x44F: 0xFF
}
String.prototype.Win1251_charCodeAt=function(char_num){
var char_code=this.charCodeAt(char_num);
return (char_code===undefined)?0x98:Win1251[char_code];
}
function utf8_decode(text){
text=text.replace(/ /g,"\u00A0");
var char_code, char_code2, char_code3, char_code4;
var result_str='';
for(var char_num=0; char_num<text.length; char_num++)
if((char_code=text.Win1251_charCodeAt(char_num))<0x80 || char_code===text.charCodeAt(char_num))
result_str+=text.charAt(char_num);//0zzzzzzz - 00000000 00000000 00000000 0zzzzzzz
else if(char_code>=0xC0)
if(char_code<0xE0){
if(
(char_code2=text.Win1251_charCodeAt(++char_num))>=0x80 &&
char_code2<0xC0
)//110yyyyy 10zzzzzz - 00000000 00000000 00000yyy yyzzzzzz
result_str+="&#"+((char_code-0xC0)*0x40+(char_code2-0x80))+";";
}
else if(char_code<0xF0){
if(
(char_code2=text.Win1251_charCodeAt(++char_num))>=0x80 &&
char_code2<0xC0 &&
(char_code3=text.Win1251_charCodeAt(++char_num))>=0x80 &&
char_code3<0xC0
)//1110xxxx 10yyyyyy 10zzzzzz - 00000000 00000000 xxxxyyyy yyzzzzzz
result_str+="&#"+((char_code-0xE0)*0x1000+(char_code2-0x80)*0x40+(char_code3-0x80))+";";
}
else if(
char_code<0xF8 &&
(char_code2=text.Win1251_charCodeAt(++char_num))>=0x80 &&
char_code2<0xC0 &&
(char_code3=text.Win1251_charCodeAt(++char_num))>=0x80 &&
char_code3<0xC0 &&
(char_code4=text.Win1251_charCodeAt(++char_num))>=0x80 && char_code4<0xC0
)//11110www 10xxxxxx 10yyyyyy 10zzzzzz - 00000000 000wwwxx xxxxyyyy yyzzzzzz
result_str+="&#"+((char_code-0xF0)*0x40000+(char_code2-0x80)*0x1000+(char_code3-0x80)*0x40+(char_code4-0x80))+";";
return result_str;
}
function unescapeTitle(title){
return unescape(
utf8_decode(document.title).replace(
/&#([0-9]+);/g,
function(expression, value){
if(isNaN(value=parseInt(value, 10)))
return NaN;
var i=0, retval="", radix=16;
while(i++<4 || value>0){
retval=["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F"][value%radix]+retval;
value=Math.floor(value/radix);
}
return "%u"+retval;
}
)
);
}
document.body.innerHTML=utf8_decode(document.body.innerHTML);
if("vendor" in navigator && navigator.vendor.indexOf("Apple")>-1){
document.title=unescapeTitle(document.title);
return;
}
/*@cc_on
document.title=unescapeTitle(document.title);
return;
@*/
document.getElementsByTagName("title")[0].innerHTML=utf8_decode(document.title);
}
);
Проверено в Firefox 3 и 4; Opera 9, 10 и 11; Internet Explorer 5.5, 6, 7, 8; Google Chrome и Safari последних релизных версий.
Конечно, это кунштюк; я на нём разобрался, что такое UTF-8. По-хорошему, сервер не должен вредить своими HTTP-заголовками. Но тут встаёт философский вопрос: а кому лучше знать кодировку документа — серверу (автору .htaccess) или самому HTML-документу (его автору)? Возможно, у браузеров есть веская причина верить серверу, а не meta
-тегу в документе.
Проблема кодировок часто возникает при написании парсеров, чтении данных из xml и CSV файлов. Ниже представлены способы эту проблему решить.
1
windows-1251 в UTF-8
$text = iconv('windows-1251//IGNORE', 'UTF-8//IGNORE', $text);
echo $text;
PHP
$text = mb_convert_encoding($text, 'UTF-8', 'windows-1251');
echo $text;
PHP
2
UTF-8 в windows-1251
$text = iconv('utf-8//IGNORE', 'windows-1251//IGNORE', $text);
echo $text;
PHP
$text = mb_convert_encoding($text, 'windows-1251', 'utf-8');
echo $text;
PHP
3
Когда ни что не помогает
$text = iconv('utf-8//IGNORE', 'cp1252//IGNORE', $text);
$text = iconv('cp1251//IGNORE', 'utf-8//IGNORE', $text);
echo $text;
PHP
Иногда доходит до бреда, но работает:
$text = iconv('utf-8//IGNORE', 'windows-1251//IGNORE', $text);
$text = iconv('windows-1251//IGNORE', 'utf-8//IGNORE', $text);
echo $text;
PHP
4
File_get_contents / CURL
Бывают случаи когда file_get_contents()
или CURL возвращают иероглифы (ÐлмазнÑе боÑÑ) – причина тут не в кодировке, а в отсутствии BOM-метки.
$text = file_get_contents('https://example.com');
$text = "\xEF\xBB\xBF" . $text;
echo $text;
PHP
Ещё бывают случаи, когда file_get_contents() возвращает текст в виде:
�mw�Ƒ0�����&IkAI��f��j4/{�</�&�h�� ��({�o�����:/��<g���g��(�=�9�Paɭ
Это сжатый текст в GZIP, т.к. функция не отправляет правильные заголовки. Решение проблемы через CURL:
function getcontents($url){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_ENCODING, 'gzip');
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
$output = curl_exec($ch);
curl_close($ch);
return $output;
}
echo getcontents('https://example.com');
PHP
12.01.2017, обновлено 02.11.2021
Другие публикации
Отправка e-mail в кодировке UTF-8 с вложенными файлами и возможные проблемы.
JSON (JavaScript Object Notation) – текстовый формат обмена данными, основанный на JavaScript, который представляет собой набор пар {ключ: значение}. Значение может быть массивом, числом, строкой и…
Описание значений глобального массива $_SERVER с примерами.
Так как Instagram и Fasebook ограничили доступ к API, а фото с открытого аккаунта всё же нужно периодически получать и…
В статье представлены различные PHP-расширения для чтения файлов XLS, XLSX, описаны их плюсы и минусы, а также примеры…
Примеры как зарегистрировать бота в Телеграм, описание и взаимодействие с основными методами API.
11 / 10 / 3 Регистрация: 25.09.2015 Сообщений: 238 |
|
1 |
|
25.09.2015, 18:03. Показов 18878. Ответов 12
Здравствуйте.
0 |
53 / 53 / 28 Регистрация: 23.04.2011 Сообщений: 214 |
|
25.09.2015, 19:02 |
2 |
Как вариант — перекодировать в Notepad++
0 |
11 / 10 / 3 Регистрация: 25.09.2015 Сообщений: 238 |
|
25.09.2015, 19:29 [ТС] |
3 |
Как вариант — перекодировать в Notepad++ Попробовал. Добавлено через 1 минуту
0 |
53 / 53 / 28 Регистрация: 23.04.2011 Сообщений: 214 |
|
25.09.2015, 19:33 |
4 |
Ctrl+A, Ctrl+X, меняем кодировку, Ctrl+C
0 |
2964 / 2593 / 1068 Регистрация: 15.12.2012 Сообщений: 9,831 Записей в блоге: 11 |
|
25.09.2015, 19:39 |
5 |
0 |
11 / 10 / 3 Регистрация: 25.09.2015 Сообщений: 238 |
|
25.09.2015, 19:43 [ТС] |
6 |
lounge.rar Я конечно очень благодарен но можно поподробней.
0 |
2964 / 2593 / 1068 Регистрация: 15.12.2012 Сообщений: 9,831 Записей в блоге: 11 |
|
25.09.2015, 19:50 |
7 |
Сообщение было отмечено Майкл Скоуфилд как решение РешениеМайкл Скоуфилд
1 |
Юзер с абсолютным слухом 709 / 489 / 195 Регистрация: 17.12.2010 Сообщений: 1,419 |
|
25.09.2015, 20:05 |
8 |
На всякий пожарный в Notepad++ после перекодирования сделайте ещё любое изменение содержимого документа, сохраните изменение (нажмите на дискетку) и после этого убедитесь, что документ перекодировался. Для этого ещё раз зайдите главное меню-кодировки. Там напротив Кодировка в UTF-8 должна стоять птичка.
0 |
11 / 10 / 3 Регистрация: 25.09.2015 Сообщений: 238 |
|
25.09.2015, 20:06 [ТС] |
9 |
Не уверен, что этот хостинг не поддерживает win-1251… Он поддерживает win-1251 но в этом формате нет возможности редактирования файлов прямо на хостинге.
0 |
2964 / 2593 / 1068 Регистрация: 15.12.2012 Сообщений: 9,831 Записей в блоге: 11 |
|
25.09.2015, 20:27 |
10 |
Он поддерживает win-1251 но в этом формате нет возможности редактирования файлов прямо на хостинге. Надо испытать… Что код можно поправить — это помню, а кириллические символы отображаются крякозябрами потому-что файловый менеджер работает в ANSI, если память не изменяет… Добавлено через 11 минут
0 |
Юзер с абсолютным слухом 709 / 489 / 195 Регистрация: 17.12.2010 Сообщений: 1,419 |
|
25.09.2015, 20:53 |
11 |
Да, оказывается, во втором файл-менеджере можно, но изначально русские буквы отображаются среднеевропейской кодировкой, (как в правой части скрина) а после сохранения изменения предстают в таком виде: дельта-диез-юникод в четырёх цифрах. А в первом файл-менеджере у меня выскакивает, как в левой части скрина. Миниатюры
0 |
11 / 10 / 3 Регистрация: 25.09.2015 Сообщений: 238 |
|
25.09.2015, 21:51 [ТС] |
12 |
кириллические символы отображаются крякозябрами Провёл все манипуляции с перекодировкой, залил на хостинджер.
0 |
Fedor92 |
25.09.2015, 22:35
|
Не по теме:
кириллические символы отображаются нормально. Речь шла о файлах сохранённых в кодировке windows-1251… C utf-8 проблем не возникнет…
0 |
Имеется сайт на PHP, существующий уже много-много лет. Сайт создавался и развивался в кодировке windows-1251, но дальше так жить невозможно, надо весь PHP-код преобразовать в UTF-8, то же самое сделать с html-, css-, js- и прочими файлами, сконвертировать базу данных MySQL и ещё кое-что подправить.
Как быстро выполнить переход сайта на кодировку UTF-8?
Нам помогут знания из статьи про recode и enconv, добавим к ним ещё кое-что.
Все действия можно свести в один bash-скрипт, отдельные части которого рассмотрим в статье.
1. Создать копию всех файлов сайта. Например, сайт находится в /var/www/site. Для работы сайта ещё используются /var/www/dir1, /var/www/dir2, /var/www/dir3, причём dir1 и dir2 надо перекодировать вместе с site, а dir3 не надо трогать. Скопируем всё в /var/www-u8. Для удобства будем использовать переменные, в которых сохраним часто используемые строки.
dir_source=’/var/www’
dir_u8=’/var/www-u8′
cp -R ${dir_source}/* ${dir_u8}
Массив, содержащий имена подкаталогов, в которых надо обработать файлы:
subdirs=(site dir1 dir2)
Во всех подкаталогах надо перекодировать из windows-1251 в UTF-8 все файлы с расширениями: php, txt, js, css, htm. Нам поможет enconv. Затем найти подстроки «windows-1251» или «cp1251» и заменить на «UTF-8». Наконец, найти в php-файлах короткий открывающий тег «<?» и заменить его на полный «<?php». Регулярное выражение для поиска короткого тега ищет строку ‘<?’, после которой следует пробел, конец строки или символ ‘=’ (для файлов, в которых php-код используется вперемешку с html для вставки значений переменных: ‘<?=$var;?>’). Все замены поможет выполнить могучий sed, а с подбором файлов для обработки отлично справится find. Поскольку обработку надо выполнить в нескольких подкаталогах (их имена хранятся в массиве $subdirs), то перебираем элементы массива в цикле (подробнее про использование массивов в bash) и из них составляем путь для поиска командой find.
for item in ${subdirs[*]} do sPath=${dir_u8}/${item} find ${sPath} -iregex '.*\.\(txt\|php\|css\|js\|html?\)' -exec enconv -L russian -x utf8/LF '{}' \; find ${sPath} -iregex '.*\.\(txt\|php\|css\|js\|html?\)' -exec sed -i -r 's/windows-1251|cp1251/UTF-8/ig' '{}' \; find ${sPath} -iname '*\.php' -exec sed -i -r 's/(<\?)(\s|$|=)/<?php\2/ig' '{}' \; done
С перекодировкой базы данных MySQL вообще всё просто. Надо сделать дамп данных, в области описания таблиц заменить строки, определяющие кодировку, загрузить дамп в новую в базу. Примерно так:
HOST_1='localhost' USER_1='user1' PASSWORD_1='password1' DATABASE_1='database1' HOST_2='localhost' USER_2='user2' PASSWORD_2='password2' DATABASE_2='database2' DUMPFILE_1="db-${DATABASE_1}.sql" DUMPFILE_2="db-${DATABASE_2}.sql" # dump from the original DB mysqldump -u ${USER_1} -h ${HOST_1} -p${PASSWORD_1} --opt ${DATABASE_1} > ${DUMPFILE_1} # Replace charset settings from cp1251 to utf8 sed -r 's/CHARSET=cp1251/CHARSET=utf8/ig' ${DUMPFILE_1} > ${DUMPFILE_2} # Load data from the dump mysql -u ${USER_2} -h ${HOST_2} -p${PASSWORD_2} ${DATABASE_2} < ${DUMPFILE_2}
В скрипте все переменные, имена которых оканчиваются на «1», относятся к исходной базе данных, работающей в кодировке cp1251. Все переменные, имена которых оканчиваются на «2», относятся к новой базе данных, которая будет использоваться в перекодированном в utf-8 сайте.
Осталось установить для файлов в ${dir_u8} нужные права доступа, при необходимости настроить контекст безопасности SELinux и, наконец, настроить вебсервер для визуальной проверки перекодированного сайта.
Если свести воедино все фрагменты bash-скрипта, написанные на этой странице, то, фактически, весь процесс изменения кодировки сайта на utf-8 окажется простым и быстрым.
Во многих скриптах экономических проектов (будь то фруктовая ферма, букс, хайп, удвоитель и т.д.) мы иногда сталкиваемся с такой проблемой ⇓.
Вместо привычной нашему глазу кириллице вот такие кракозябры, как это исправить? Как поменять кодировку на сайте? Давайте с Вами будем переводить сайт в кодировку UTF-8. Если Вы хотите перевести в любую другую кодировку, то всё будет аналогично.
Меняем кодировку при помощи Notepad++
Самый лучший способ поменять кодировку в скрипте это блокнот Notepad++ (если у вас нет Notepad++ на компьютере, то Гугл в помощь, только качаем блокнот с официального сайта!).
Все текстовые файлы (html, php, js, txt, в общем, в которых есть текст) перекодируйте в UTF-8. Сделать это очень просто через Notepad++ в пункте «Преобразовать в UTF-8 без BOM» из меню «Кодировки». Причём именно все файлы, которые даже ничего не выводят на страницу.
Поменять кодировку с помощью файла .htaccess
Если же не хотите возится с каждым файлом в скрипте, то есть и такая альтернатива:
1. Поместите в корень сайта файл .htaccess с текстом AddDefaultCharset UTF-8.
2. Поменяйте кодировку в мета-теге <meta http-equiv=»Content-type» content=»text/html; charset=utf-8″ />.
Если Ваш сайт не использует базу данных, то на этом этапе можно закончить менять кодировку. Но если база данных есть, то нужно сделать ещё и следующие шаги:
1. Сразу после подключения к БД выполните запрос: SET NAMES UTF-8
2. В phpMyAdmin поменяйте кодировку базы данных на utf8_general_ci в её настройках.
3. Поставьте у всех таблиц кодировку utf8_general_ci.
4. У всех текстовых типов полей так же поставьте кодировку utf8_general_ci.
Всё, теперь Ваша кодировка на сайте изменена. Добавлю лишь, что если где-то в коде Вы занимались преобразованием из одной кодировки в другую (например, через функцию iconv()), то тщательно проверьте это место, возможно, там появится проблема.
Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь. Мы рекомендуем Вам зарегистрироваться либо зайти на сайт под своим именем.