Из windows 1251 в utf 8 html

Время на прочтение
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 в PHP

JSON (JavaScript Object Notation) – текстовый формат обмена данными, основанный на JavaScript, который представляет собой набор пар {ключ: значение}. Значение может быть массивом, числом, строкой и…

Массив $_SERVER

Описание значений глобального массива $_SERVER с примерами.

Получить фото из Instagram без API

Так как Instagram и Fasebook ограничили доступ к API, а фото с открытого аккаунта всё же нужно периодически получать и…

Обзор PHP расширений для чтения файлов Excel

В статье представлены различные PHP-расширения для чтения файлов XLS, XLSX, описаны их плюсы и минусы, а также примеры…

Бот Телеграм на PHP

Примеры как зарегистрировать бота в Телеграм, описание и взаимодействие с основными методами API.

11 / 10 / 3

Регистрация: 25.09.2015

Сообщений: 238

1

25.09.2015, 18:03. Показов 18878. Ответов 12


Студворк — интернет-сервис помощи студентам

Здравствуйте.
Не давно начал изучать HTML, XHTML, CSS.
Столкнулся с небольшой проблемой.
Изучаю по книге, по ходу чтения там идёт развитие, улучшение нескольких сайтов.
Кодировка символов на ПК Windows-1251, а когда хотел залить свой сайт на Hostinger выяснил что нужно UTF-8, иначе редактировать файлы на хосте нет возможности.
Как перекодировать сайт с Windows-1251 на UTF-8?
И ещё один ньюанс. Когда пишешь на UTF-8 то потом открывая HTML файл в браузере вместо букв иероглифы.
Прикреплю архив с сайтом.lounge.rar



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

Цитата
Сообщение от Micheal
Посмотреть сообщение

Как вариант — перекодировать в Notepad++

Попробовал.
Выделил всё, нажал перекодировать в UTF-8 изменил charset, толку ноль.

Добавлено через 1 минуту
Только теперь при открытие сайта вместо русских символов ромбики со знаком вопроса внутри.
Залил файл на Hostinger, попробовал его там открыть для редактирования.
Говорит что файл не в формате UTF-8



0



53 / 53 / 28

Регистрация: 23.04.2011

Сообщений: 214

25.09.2015, 19:33

4

Ctrl+A, Ctrl+X, меняем кодировку, Ctrl+C



0



Эксперт HTML/CSS

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

Цитата
Сообщение от Fedor92
Посмотреть сообщение

lounge.rar

Я конечно очень благодарен но можно поподробней.
Как вы его перекодировали, что б я мог сам это зделать.
Когда писал на utf-8 у меня потом были иероглифы только вместо русских слов.
Можете объяснить?



0



Эксперт HTML/CSS

2964 / 2593 / 1068

Регистрация: 15.12.2012

Сообщений: 9,831

Записей в блоге: 11

25.09.2015, 19:50

7

Лучший ответ Сообщение было отмечено Майкл Скоуфилд как решение

Решение

Майкл Скоуфилд
1. Меняем в теге meta, расположенном в head, кодировку с windows-1251 на utf-8…
2. Создаём новый файл с кодировкой utf-8, с помощью копипаста(описанного в посте №4, последний пункт Ctrl+V) переносим код из старого файла в новый, сохраняем новый файл с заменой старого, все манипуляции производим с файлами, в которых кодировка не соответствует utf-8… Пару слов о hostinger… Не уверен, что этот хостинг не поддерживает win-1251…



1



Юзер с абсолютным слухом

709 / 489 / 195

Регистрация: 17.12.2010

Сообщений: 1,419

25.09.2015, 20:05

8

На всякий пожарный в Notepad++ после перекодирования сделайте ещё любое изменение содержимого документа, сохраните изменение (нажмите на дискетку) и после этого убедитесь, что документ перекодировался. Для этого ещё раз зайдите главное меню-кодировки. Там напротив Кодировка в UTF-8 должна стоять птичка.
Вообще, Notepad++ это отличная вещь для онлайн-редактирования по FTP. Т. е., Вы редактируете в Notepad++, жмёте на дискетку, а изменения сохраняются на сервере. Это избавит от хлопот, связанных с HTML-редактором хостингера. Вначале нужно будет в Notepad++ настроить FTP-соединение, нажав на крайнюю справа кнопку в панели инструментов. Хостингер 1251 поддерживает, но речь идёт о том, что она не редактируется в редакторах хостингера.



0



11 / 10 / 3

Регистрация: 25.09.2015

Сообщений: 238

25.09.2015, 20:06

 [ТС]

9

Цитата
Сообщение от Fedor92
Посмотреть сообщение

Не уверен, что этот хостинг не поддерживает win-1251…

Он поддерживает win-1251 но в этом формате нет возможности редактирования файлов прямо на хостинге.
Да и мне на будущее всё равно нужно будет работать с UTF-8.
Очень благодарен за помощь.



0



Эксперт HTML/CSS

2964 / 2593 / 1068

Регистрация: 15.12.2012

Сообщений: 9,831

Записей в блоге: 11

25.09.2015, 20:27

10

Цитата
Сообщение от Майкл Скоуфилд
Посмотреть сообщение

Он поддерживает win-1251 но в этом формате нет возможности редактирования файлов прямо на хостинге.

Надо испытать… Что код можно поправить — это помню, а кириллические символы отображаются крякозябрами потому-что файловый менеджер работает в ANSI, если память не изменяет…

Добавлено через 11 минут
CP1251 декодируется в CP1252 при открытии файла в менеджере, а код можно отредактировать…



0



Юзер с абсолютным слухом

709 / 489 / 195

Регистрация: 17.12.2010

Сообщений: 1,419

25.09.2015, 20:53

11

Да, оказывается, во втором файл-менеджере можно, но изначально русские буквы отображаются среднеевропейской кодировкой, (как в правой части скрина) а после сохранения изменения предстают в таком виде: дельта-диез-юникод в четырёх цифрах. А в первом файл-менеджере у меня выскакивает, как в левой части скрина.

Миниатюры

Как изменить кодировку символов с Windows-1251 на UTF-8?
 



0



11 / 10 / 3

Регистрация: 25.09.2015

Сообщений: 238

25.09.2015, 21:51

 [ТС]

12

Цитата
Сообщение от Fedor92
Посмотреть сообщение

кириллические символы отображаются крякозябрами

Провёл все манипуляции с перекодировкой, залил на хостинджер.
Всё работает отлично, всё редактируется, кириллические символы отображаются нормально.



0



Fedor92

25.09.2015, 22:35


    Как изменить кодировку символов с Windows-1251 на UTF-8?

Не по теме:

Цитата
Сообщение от Майкл Скоуфилд
Посмотреть сообщение

кириллические символы отображаются нормально.

Речь шла о файлах сохранённых в кодировке 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()), то тщательно проверьте это место, возможно, там появится проблема.

Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь. Мы рекомендуем Вам зарегистрироваться либо зайти на сайт под своим именем.

  • Из windows 10 не могу зайти на сетевую папку windows 7
  • Из за чего мерцает монитор компьютера windows 10
  • Из bios пропал windows boot manager
  • Из за чего компьютер долго включается windows 10
  • Иероглифы в приложении windows 10