Как изменить кодировку строки после чтения из файла, используя кодировку по умолчанию?

Недостатки и достоинства

UTF-8, в отличие от windows-1251 универсальная кодировка, в ней содержатся буквы различных алфавитов. Существует даже UTF-128, где есть вообще все языки – теулу, суахили, лаосский, мальтийский и так далее.

UTF-8 победнее, буквы занимают в разы меньше места и занимают всего один байт памяти, как и в 1251. В УТФ есть редкие символы из других языков или специальные символы. Они-то и весят по 5-6 байтов, но в документе используются крайне редко.

Эта кодировка более продумана, а потому ее использует большинство приложений по умолчанию. То есть, если вы не указываете программе, какую кодировку вы используете, то первым делом он проверит именно UTF-8 .

Когда вы создаете html документ для сайта, то указываете браузерам на какую таблицу им обращать внимание при расшифровке записей. Для этого необходимо вставить в тег head следующие данные

После символов «charset=» идет либо утф, либо виндовс, как в примере ниже

Для этого необходимо вставить в тег head следующие данные. После символов «charset=» идет либо утф, либо виндовс, как в примере ниже.

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

Если в дальнейшем вы захотите что-то поменять и вставить фразу на албанском, используя эту таблицу расшифровок, то ничего не получится, ведь этого языка кодировка не поддерживает. UTF‑8 без проблем позволит вам это сделать.

Если вас заинтересовало правильное создание сайта, то я могу порекомендовать вам курс Михаила Русакова «Создание и Раскрутка сайта от А до Я».

Он содержит в себе очень много – 256 уроков, затрагивающих HTML, CSS, JavaScript, PHP, MySQL и XML. Помимо языков программирования вы сможете понять как монетизировать сайт, то есть скорее и больше получать прибыль. Один из немногих курсов, в котором было бы так подробно разъяснено все, что нужно.

Сам я вот уже год обучаюсь в школе блоггеров Александра Борисова. Это занимает в разы больше времени, конца и края пока не видно, но зато не менее исчерпывающе и дисциплинирует. Мотивирует продолжать разработку.

Ну а если возникают вопросы, не нужно искать по интернету. Всегда есть грамотный наставник.

Что-то я отошел от темы. Давайте вернемся к кодировкам.

Расшифровка мира кодировки UTF-8

Это было много слов о словах, поэтому давайте резюмируем то, что мы рассмотрели:

  1. Компьютеры хранят данные, включая текстовые символы, как двоичные (единицы и нули).
  2. ASCII был ранним способом кодирования или отображения символов в двоичный код, чтобы компьютеры могли их хранить. Однако в ASCII не было достаточно места для представления нелатинских символов и чисел в двоичном формате.
  3. Юникод был решением этой проблемы. Юникод присваивает уникальный «код» каждому символу на каждом человеческом языке.
  4. UTF-8 – это метод кодировки символов Unicode. Это означает, что UTF-8 берет кодовую точку для данного символа Юникода и переводит ее в строку двоичного кода. Он также делает обратное, считывая двоичные цифры и преобразуя их обратно в символы.
  5. UTF-8 в настоящее время является самым популярным методом кодирования в Интернете, поскольку он может эффективно хранить текст, содержащий любой символ.
  6. UTF-16 – еще один метод кодирования, но он менее эффективен для хранения текстовых файлов (за исключением тех, которые написаны на некоторых неанглийских языках).

Перевод Unicode – это не то, о чем большинству из нас нужно думать при просмотре или разработке веб-сайтов, и именно в этом суть – создать бесшовную систему обработки текста, которая работает для всех языков и веб-браузеров. Если он работает хорошо, вы этого не заметите.

Но если вы обнаружите, что страницы вашего веб-сайта занимают чрезмерно много места или если ваш текст завален буквами and и, пора применить ваши новые знания о UTF-8.

Источник записи: https://blog.hubspot.com

Немного теории

Любой документ на компьютере или в интернете, как я уже сказал, хранится в виде двоичного кода. К примеру, если вы используете кодировку ASCII, то буква «К» будет записана как 10001010, а windows 1251 под этим числом скрывается символ – Љ. В итоге, если браузер или программа обратится к другой таблице и считает вместо ASCII коды windows 1251, то читатель увидит совершенно непонятные ему символ.

Логичен вопрос, нафига было придумывать множество таблиц с кодами? Дело в том, что помимо русского алфавита существует еще и английский, немецкий, китайский. По некоторым подсчетам, существует около 200 000 символов. Хотя, я не очень доверяю этой статистике, вспоминая про японский.

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

Чем больше в таблице символов, тем длиннее код каждого из них, а значит и вес документа становится больше.

Представьте, если бы одна книга весила 4 Гб! Она бы очень долго загружалась, занимала все свободное место на компьютере. Решение о скачивании представлялось бы делом нелегким.

Если вспомнить о сайтах, то вообще страшно подумать, что бы произошло. Каждая страничка открывалась даже на скоростном оптоволокне по часу с лишним! Думаю, мобильные телефоны можно было бы смело выкидывать. Пользоваться ими на улице даже с 4G? Сомневаюсь.

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

Microsoft, к примеру, для русскоязычного сегмента создали windows-1251. В ней, конечно же, есть свои достоинства и недостатки. Как и у любого другого продукта.

Сейчас уже, лишь 2% всех страниц в интернете написано на 1251. Большинство веб-мастеров используют UTF-8. Почему так?

Базы банных

Когда речь идет о php, все вообще страшно. Я уже рассказывал про базы данных, они используются для ускорения работы сайта. Обычно, вы к ним не обращаетесь, но когда появляется необходимость в переносе сайта становится не по себе.

Сложности случаются у всех, не важно какой у вас опыт работы, стаж и выслуга лет. Некоторые странички в базе могут содержать в себе все доступные символы для виндовс-1251, другие, к примеру, в шаблонах страниц, в другой кодировке

Пока не нужен перенос все работает и функционирует, хоть и не совсем правильно. Но после переезда начинаются неприятности. В идеале вы должны использовать либо только УТФ, либо виндовс-1251, но по факту всегда и у всех случаются вот такие недочеты.

Чтобы расшифровка согласовалась необходимо вписать код mysql_query(«SET NAMES cp1251»). В этом случае преобразование будет осуществлять по другому протоколу – cp1251.

Работа с картами 1С 4 в 1: Яндекс, Google , 2ГИС, OpenStreetMap(OpenLayers) Промо

С каждым годом становится все очевидно, что использование онлайн-сервисов намного упрощает жизнь. К сожалению по картографическим сервисам условия пока жестковаты. Но, ориентируясь на будущее, я решил показать возможности API выше указанных сервисов:
Инициализация карты
Поиск адреса на карте с текстовым представлением
Геокодинг
Обратная поиск адреса по ее координатами
Взаимодействие с картами — прием координат установленного на карте метки
Построение маршрутов по указанным точками
Кластеризация меток на карте при увеличении масштаба
Теперь также поддержка тонкого и веб-клиента

1 стартмани

2. Русская кодировка в файлах

Думаю все сталкивались с ситуацией, когда при чтении/записи русского текста выводились/сохранялись страшные символы не имеющие ничего общего с тем текстом, с которым вы работали.

Многие воспринимают это как «кривость», или «баг». Нет, ребята. Это не баг — это фича =).

Как все мы знаем — текст сохраняется в определенной кодировке. Где каждому возможному символу соответствует определенный байт (или даже 2 байта). Поэтому есть однобайтовые кодировки и двубайтные кодировки.

Преимущества и недостатки данных кодировок очевидны — однобайтная кодировка содержит в себе только 256 символов (один байт = 8 бит = 2^8 (так как бит равен или 0, или 1) = 256). Если предположить, что в алфавите 30 букв, то 3 алфавита — это 90 символов. Их нужно умножить на два, так как буквы могут быть маленькими и большими. Выходит 180 символов. Остается всего 76 символов. Выходит минус однобайтовой кодировки в том, что она сильно ограничена символами. А плюс, соответственно, в том, что она маловесна. И текст из 1000 символов будет иметь размер лишь 1000 байт. В то время у двубайтной кодировки вес будет уже 2000 байт. Зато у двубайтной кодировки уже возможно 65536 символов.

Именно из-за того, что кодировок много — каждому тяжело угодить даже с двубайтной кодировкой. Поэтому если вы хотите, чтобы российский текст корректно сохранялся и читался — нужно указывать необходимую кодировку. Обычно используется кодировка Windows-1251.

Код для чтения текста из файла:

C#

StreamReader streamReader = new StreamReader(file, Encoding.GetEncoding(«windows-1251»));
string text = streamReader.ReadToEnd();
streamReader.Close();
streamReader.Dispose();

1
2
3
4

StreamReader streamReader=newStreamReader(file,Encoding.GetEncoding(«windows-1251»));

stringtext=streamReader.ReadToEnd();

streamReader.Close();

streamReader.Dispose();

Соответственно для записи:

C#

StreamWriter streamWriter = new StreamWriter(filename, false, Encoding.GetEncoding(«windows-1251»));
streamWriter.Write(contain);
streamWriter.Close();
streamWriter.Dispose();

1
2
3
4

StreamWriter streamWriter=newStreamWriter(filename,false,Encoding.GetEncoding(«windows-1251»));

streamWriter.Write(contain);

streamWriter.Close();

streamWriter.Dispose();

Кстати насчет записи.. При объявлении StreamWriter используется 3 параметра. Первый — путь к файлу. Третий — указание кодировки. А второй таинственный false — является флагом дописывания в файл.

Если стоит false — то каждый раз при объявлении записи в данный файл его старое содержимое будет обнуляться.

Если стоит true — то всё будет дописываться.

То есть если ваша программа ведет лог ошибок, то лучше ставить true, чтобы пользователь мог посмотреть всю историю ошибок программы за весь период пользования.

Юникод

Нетрудно понять, что, хотя кодирование важно, декодирование в равной степени жизненно важно для понимания представлений. Это возможно на практике только в том случае, если широко используется согласованная или совместимая схема кодирования

Различные схемы кодирования, разработанные изолированно и практикуемые в местных географических регионах, начали становиться сложными.

Эта проблема породила особый стандарт кодирования, называемый Unicode, который имеет емкость для всех возможных символов в мире . Это включает в себя символы, которые используются, и даже те, которые уже не существуют!

Ну, для этого должно потребоваться несколько байтов для хранения каждого символа? Честно говоря, да, но у Unicode есть гениальное решение.

Unicode как стандарт определяет кодовые точки для каждого возможного символа в мире. Кодовая точка для символа “T” в Юникоде равна 84 в десятичной системе счисления. Обычно мы называем это “U+0054” в Юникоде, который представляет собой не что иное, как U+, за которым следует шестнадцатеричное число.

Мы используем шестнадцатеричную систему в качестве основы для кодовых точек в Юникоде, поскольку существует 1 114 112 точек, что является довольно большим числом для удобной передачи в десятичном формате!

То, как эти кодовые точки кодируются в биты, зависит от конкретных схем кодирования в Юникоде. Мы рассмотрим некоторые из этих схем кодирования в подразделах ниже.

5.1. UTF-32

UTF-32-это схема кодирования для Unicode, которая использует четыре байта для представления каждой кодовой точки , определенной Unicode. Очевидно, что использование четырех байтов для каждого символа неэффективно.

Давайте посмотрим, как простой символ, такой как “T”, представлен в UTF-32. Мы будем использовать метод преобразования в двоичный код , введенный ранее:

assertEquals(convertToBinary("T", "UTF-32"), "00000000 00000000 00000000 01010100");

Вывод выше показывает использование четырех байтов для представления символа “T”, где первые три байта-это просто потраченное впустую пространство.

5.2. UTF-8

UTF-8-это другая схема кодирования для Unicode, которая использует переменную длину байтов для кодирования . Хотя он обычно использует один байт для кодирования символов, при необходимости он может использовать большее количество байтов, что экономит место.

Давайте снова вызовем метод convertToBinary с вводом как “T” и кодированием как ” UTF-8″:

assertEquals(convertToBinary("T", "UTF-8"), "01010100");

Вывод в точности аналогичен ASCII, использующему только один байт. На самом деле UTF-8 полностью обратно совместим с ASCII.

Давайте снова вызовем метод convertToBinary с вводом как “語” и кодированием как ” UTF-8″:

assertEquals(convertToBinary("語", "UTF-8"), "11101000 10101010 10011110");

Как мы видим здесь, UTF-8 использует три байта для представления символа “語”. Это известно как кодирование переменной ширины .

UTF-8, благодаря своей экономичности пространства, является наиболее распространенной кодировкой, используемой в Интернете.

Комментарии

Кодирование — это процесс преобразования набора символов Юникода в последовательность байтов. Декодирование — это процесс преобразования последовательности закодированных байтов в набор символов Юникода.

Стандарт Юникода присваивает каждому символу в каждом поддерживаемом скрипте кодовую точку (число). Формат преобразования Юникода (UTF) — это способ кодирования кодовой точки. Стандарт Unicode использует следующие утфс:

  • UTF-8, который представляет каждую кодовую точку как последовательность из одного до четырех байтов.

  • UTF-16, представляющий каждую кодовую точку как последовательность из одного до 2 16-разрядных целых чисел.

  • UTF-32, представляющий каждую кодовую точку в виде 32-разрядного целого числа.

дополнительные сведения о утфс и других кодировках System.Text , поддерживаемых, см. в разделе кодировка символов в платформа .NET Framework.

UnicodeEncodingКласс представляет кодировку UTF-16. Кодировщик может использовать обратный порядок байтов (самый значащий байт) или прямой порядок байтов (минимальный значащий байт). Например, Латинская прописная буква A (кодовая точка U + 0041) сериализуется следующим образом (в шестнадцатеричном формате):

  • Обратный порядок байтов с обратным порядком: 00 00 00 41

  • Прямой порядок байтов: 41 00 00 00

Обычно более эффективно хранить символы Юникода с помощью собственного байтового порядка конкретной платформы. Например, лучше использовать прямой порядок байтов на платформах с прямым порядком байтов, таких как компьютеры Intel. UnicodeEncodingкласс соответствует Windows кодовых страниц 1200 (с прямым порядком байтов) и 1201 (порядок байт с обратным порядком байтов). Можно определить «порядок следования байтов» определенной архитектуры, вызвав BitConverter.IsLittleEndian метод.

При необходимости UnicodeEncoding объект предоставляет метку порядка байтов (BOM), которая представляет собой массив байтов, который может быть префиксом последовательности байтов, полученной в результате процесса кодирования. Если преамбула содержит метку порядка байтов (BOM), она помогает декодеру определить порядок байтов и формат преобразования или кодировку UTF.

Если UnicodeEncoding экземпляр настроен для предоставления спецификации, его можно извлечь, вызвав GetPreamble метод. в противном случае метод возвращает пустой массив

Обратите внимание, что, даже если UnicodeEncoding объект настроен для поддержки спецификации, необходимо включить спецификацию в начало закодированного потока байтов. методы кодирования UnicodeEncoding класса не делают это автоматически

Внимание!

Чтобы включить обнаружение ошибок и сделать экземпляр класса более безопасным, необходимо создать экземпляр UnicodeEncoding объекта, вызвав конструктор и установив для его аргумента значение . При обнаружении ошибок метод, который обнаруживает недопустимую последовательность символов или байтов, создает исключение ArgumentException . Без обнаружения ошибок исключение не создается, а недопустимая последовательность обычно игнорируется.

Создать экземпляр UnicodeEncoding объекта можно несколькими способами, в зависимости от того, нужно ли ему предоставлять метку порядка следования байтов (BOM), требуется ли кодирование с обратным порядком или обратно с обратным порядком байтов и требуется ли включить обнаружение ошибок. В следующей таблице перечислены UnicodeEncoding конструкторы и Encoding свойства, возвращающие UnicodeEncoding объект.

Участник Порядок байтов BOM Определение ошибки
BigEndianUnicode С обратным порядком байтов Да Нет (замена резервного варианта)
Encoding.Unicode С прямым порядком байтов Да Нет (замена резервного варианта)
С прямым порядком байтов Да Нет (замена резервного варианта)
Настраивается Настраивается Нет (замена резервного варианта)
Настраивается Настраивается Настраивается

GetByteCountМетод определяет, сколько байт приводит к кодированию набора символов Юникода, и GetBytes метод выполняет фактическую кодировку.

Аналогичным образом, GetCharCount метод определяет, сколько символов приводит к декодированию последовательности байтов, а GetChars методы и GetString выполняют фактическое декодирование.

Для кодировщика или декодера, который может сохранять сведения о состоянии при кодировании или декодировании данных, охватывающих несколько блоков (например, строку 1 000 000 символов, закодированную в сегментах 100 000), используйте GetEncoder Свойства и GetDecoder соответственно.

Методы расширения

Кодирует указанный объект ReadOnlySequence<T> в массив Byte, используя указанную кодировку Encoding.

Декодирует указанный объект ReadOnlySequence<T> в с использованием указанной кодировки Encoding и записывает результат в .

Кодирует указанный объект ReadOnlySequence<T> в с использованием указанной кодировки Encoding и выводит результат в .

Кодирует указанный объект ReadOnlySpan<T> в с использованием указанной кодировки Encoding и записывает результат в .

Декодирует указанный объект ReadOnlySequence<T> в с использованием указанной кодировки Encoding и записывает результат в .

Декодирует указанный объект ReadOnlySequence<T> в с использованием указанной кодировки Encoding и выводит результат в .

Декодирует указанный объект ReadOnlySpan<T> в с использованием указанной кодировки Encoding и записывает результат в .

Декодирует указанный объект ReadOnlySequence<T> в String, используя указанную кодировку Encoding.

Свойства

При переопределении в производном классе получает имя текущей кодировки, которое может использоваться с тегами текста сообщения почтового агента.

(Унаследовано от Encoding)

При переопределении в производном классе получает идентификатор кодовой страницы текущего объекта Encoding.

(Унаследовано от Encoding)

Возвращает или задает объект DecoderFallback для текущего объекта Encoding.

(Унаследовано от Encoding)

Возвращает или задает объект EncoderFallback для текущего объекта Encoding.

(Унаследовано от Encoding)

При переопределении в производном классе получает описание текущей кодировки, которое может быть прочитано пользователем.

(Унаследовано от Encoding)

При переопределении в производном классе получает имя текущей кодировки, которое может использоваться с тегами заголовка сообщения почтового агента.

(Унаследовано от Encoding)

При переопределении в производном классе получает значение, указывающее, может ли текущая кодировка использоваться клиентами браузера для отображения содержимого.

(Унаследовано от Encoding)

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

(Унаследовано от Encoding)

При переопределении в производном классе получает значение, указывающее, может ли текущая кодировка использоваться клиентами электронной почты и новостей для отображения содержимого.

(Унаследовано от Encoding)

При переопределении в производном классе получает значение, указывающее, может ли текущая кодировка использоваться клиентами электронной почты и новостей для сохранения содержимого.

(Унаследовано от Encoding)

При переопределении в производном классе получает значение, указывающее, является ли текущая кодировка доступной только для чтения.

(Унаследовано от Encoding)

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

(Унаследовано от Encoding)

Возвращает метку порядка байтов Юникода в кодировке UTF-16, если объект настроен для ее предоставления.

При переопределении в производном классе возвращает диапазон, содержащий последовательность байтов, задающую используемую кодировку.

(Унаследовано от Encoding)

При переопределении в производном классе получает для текущей кодировки имя, зарегистрированное в IANA (Internet Assigned Numbers Authority).

(Унаследовано от Encoding)

При переопределении в производном классе получает кодовую страницу операционной системы Windows, наиболее точно соответствующую текущей кодировке.

(Унаследовано от Encoding)

Настройка PowerShell

В PowerShell кодировка по умолчанию зависит от версии:

  • В PowerShell 6+ кодировка по умолчанию на всех платформах — UTF-8 без метки порядка байтов.
  • В Windows PowerShell кодировка по умолчанию — обычно Windows-1252, расширение latin-1, которое также называется ISO 8859-1.

В PowerShell 5 + можно определить кодировку по умолчанию так:

Следующий скрипт может использоваться для определения кодировки, которую ваш сеанс PowerShell выводит для скрипта, где нет метки порядка байтов.

Можно настроить PowerShell так, чтобы использовать заданную кодировку в более общем виде с помощью параметров профиля.
См. следующие статьи:

  • (https://stackoverflow.com/a/40098904).
  • (https://rkeithhill.wordpress.com/2010/05/26/handling-native-exe-output-encoding-in-utf8-with-no-bom/).

Заставить PowerShell использовать конкретную кодировку для входных данных невозможно. В PowerShell 5.1 и более ранних версий в Windows с языковым стандартом en-US по умолчанию используется кодировка Windows-1252, если отсутствует метка порядка байтов. Другие параметры языкового стандарта могут использовать другую кодировку. Для обеспечения совместимости лучше сохранять скрипты в Юникоде с меткой порядка байтов.

Важно!

Любые другие имеющиеся у вас инструменты для работы со скриптами PowerShell могут зависеть от выбранных параметров кодировки или преобразовывать скрипты в другую кодировку.

Существующие скрипты

Скрипты, которые уже находятся в файловой системе, могут нуждаться в повторном кодировании в указанную вами кодировку. В нижней строке VS Code вы увидите метку UTF-8. Щелкните ее, чтобы открыть панель действий, и выберите команду Сохранить с кодировкой. Теперь вы можете выбрать новую кодировку для этого файла. Подробные инструкции см. в разделе .

Если вам нужно повторно кодировать несколько файлов, можно использовать следующий скрипт:

Интегрированная среда сценариев (ISE) PowerShell

При редактировании скриптов с помощью интегрированной среды сценариев PowerShell необходимо синхронизировать здесь параметры кодировки.

Интегрированная среда сценариев должна учитывать метку порядка байтов, но можно также использовать отражение для задания кодировки.
Обратите внимание, что это значение не сохраняется между запусками

Система управления версиями

Некоторые системы управления версиями, например git, игнорируют кодировки; git отслеживает только байты. Поведение других, например Azure DevOps или Mercurial, может отличаться. Даже некоторые средства, основанные на git, полагаются на декодирование текста.

Если это так, убедитесь, что вы:

  • Настроили кодировку в системе управления версиями в соответствии с вашей конфигурацией VS Code.
  • Сделали так, что все файлы добавляются в систему управления версиями в соответствующей кодировке.
  • Остерегайтесь изменять кодировки, полученные через систему управления версиями. Ключевым признаком здесь будет разностный файл, который указывает, что изменения отсутствуют (так как изменены байты, но не символы).

Среды других участников

Настроив систему управления версиями, убедитесь также, что параметры других участников, работающих над теми файлами, к которым вы предоставляете общий доступ, не переопределяют кодировку путем повторного кодирования файлов PowerShell.

Другие программы

Все другие программы, которые считывают или записывают скрипты PowerShell, могут перекодировать их.

Некоторые примеры.

  • Использование буфера обмена для копирования и вставки скрипта. Такое часто встречается в следующих случаях:
    • Копирование скрипта в виртуальную машину.
    • Копирование скрипта из электронной почты или с веб-страницы.
    • Копирование скрипта через документ Microsoft Word или PowerPoint.
  • Другие текстовые редакторы, например:
    • Блокнот;
    • vim;
    • любой другой редактор скриптов PowerShell.
  • Служебные программы редактирования текста, например:
    • //
    • Операторы перенаправления PowerShell, такие как и .
  • Программы передачи файлов, такие как:
    • Веб-браузер при скачивании скриптов.
    • Общий файловый ресурс.

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

Обработка «Распознавание штрихкода с помощью утилиты Zbar» для Документооборот ред. 2 Промо

В связи с тем, что стандартный функционал программы «Документооборот» ред. 2.1 дает возможность распознавания штрихкодов только форма EAN-13, данная обработка — альтернативный способ для распознавания штрихкода в программе 1С: Документооборот ред. 2 с помощью утилиты Zbar, которая распознает в том числе и в формате Code 128 (один из стандартных штрихкодов кодирования документов, например, «Управление торговлей» ред. 11), а также с возможностью поэтапно проследить все действия от распознавания до прикрепления к документу или простой загрузки в каталоги файлов в базе 1С.

5 стартмани

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Все про сервера
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!:

Adblock
detector