Преобразование из windows 1251 в utf 8

Version: 20241125
By the same author: Virtour.fr — visites virtuelles

Универсальный декодер — конвертер кириллицы

Результат

[Результат перекодировки появится здесь...]





Гостевая книга

Поставьте ссылку на наш сайт!

<a href=»https://2cyr.com/decode/»>Универсальный декодер кириллицы</a>

Custom Work
For a small fee I can help you quickly recode/recover large pieces of data — texts, databases, websites… or write custom functions you can use (invoice available).
FAQ and contact information.

О программе

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

Использование

  • Скопируйте текст в большое текстовое поле дешифратора. Несколько первых слов будут проанализированы, поэтому желательно, чтобы в них содержалась (закодированная) кириллица.
  • Программа попытается декодировать текст и выведет результат в нижнее поле.
  • В случае удачной перекодировки вы увидите текст в кириллице, который можно при необходимости скопировать и сохранить.
  • В случае неудачной перекодировки (текст не в кириллице, состоящий из тех же или других нечитаемых символов) можно выбрать из нового выпадающего списка вариант в кириллице (если их несколько, выбирайте самый длинный). Нажав OK вы получите корректный перекодированный текст.
  • Если текст перекодирован лишь частично, попробуйте выбрать другие варианты кириллицы из выпадающего списка.

Ограничения

  • Если текст состоит из вопросительных знаков («???? ?? ??????»), то проблема скорее всего на стороне отправителя и восстановить текст не получится. Попросите отправителя послать текст заново, желательно в формате простого текстового файла или в документе LibreOffice Writer/MSOffice Word.
  • Не любой текст может быть гарантированно декодирован, даже если вы уверены на 100%, что он написан в кириллице.
  • Анализируемый и декодированный тексты ограничены размером в 100 Кб.
  • Программа не всегда дает стопроцентную точность: при перекодировке из одной кодовой страницы в другую могут пропасть некоторые символы, такие как болгарские кавычки, реже отдельные буквы и т.п.
  • Программа проверяет максимум 8280 вариантов из двух и трех перекодировок: если имело место многократное перекодирование вроде koi8(utf(cp1251(utf))), оно не будет распознано или проверено. Обычно возможные и отображаемые верные варианты находятся между 32 и 255.
  • Если части текста закодированы в разных кодировках, программа сможет распознать только одну часть за раз.

Условия использования

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

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

Переводчики

Русский (Russian) : chAlx; Пётр Васильев (http://yonyonson.livejournal.com/); Сергей.

Страница подготовки переводов на другие языки находится тут.

Что нового

October 2013 : I am trying different optimizations for the system which should make the decoder run faster and handle more text. If you notice any problem, please notify me ASAP.

На английской версии страницы доступен changelog программы.

Вернуться к кириллической виртуальной клавиатуре.

Декодер онлайн (decoder online)

Текст успешно скопирован!

Определить исходную кодировку

При онлайн передаче электронных документов (почтовая рассылка, скачивание с сайта и т.д.) в файле может сбиться кодировка. В результате вместо привычных слов, предложений и абзацев вы получаете последовательность непонятных символов. Так случается из-за того, что кодирование и декодирование информации происходит некорректно, и устройства отправителя и получателя просто не понимают друг друга. Чтобы расшифровать зашифрованный текст, обратитесь к нашему онлайн декодеру. Decoder (дешифратор или декодер онлайн) от компании Involta способен подобрать нужную кодировку и изменить текст так, чтобы Вы смогли быстро прочитать непонятные «иероглифы». Наш инструмент имеет множество возможностей для декодирования. Он позволяет расшифровать base64 и определить исходные данные, а также перевести информацию в любую другую кодировку онлайн, например, UTF-8, CP-1251, ASCII. Decoder может функционировать как шифратор и дешифратор, то есть вы можете закодировать текст и защитить его содержимое от посторонних глаз. Если вам прислали ссылку с непонятным адресом, то URL-decoder online покажет, на какой сайт она ведет. Еще одна полезная функция сервиса – создать или раскодировать транслит, если нужно сделать перевод с кириллицы на латиницу и наоборот. Декодер работает в режиме онлайн и доступен на любом устройстве с доступом в интернет.

Всем привет. Столкнулся с вопросом конвертации базы из CP1251 в UTF8.
Полазив по просторам Интернета не нашел готового скрита (видимо плохо искал).
Вот решил написать свой скриптп. Конвертация происходит безо всяких дампов базы. Решены проблемы с символами е = ё и т.д.

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

UPD:
По просьбам трудящихся описываю алгоритм работы:
1. Переименовываем таблицу во временную.
2. Берем описание таблицы. В ней меняем defaul charset на utf8. Ставим collate utf8_bin(делается, чтобы буквы нормлаьно перекодировались. И не было проблем с е = ё и т.д. Но есть 1 трабла — при сравнении строковых значений будет учитываться регистр).
3. Отключаем использование ключей(увеличивается скорость вставки). ALTER TABLE table_in_utf8 DISABLE KEYS;
4. Вставляем данные из таблицы, которая у нас в cp1251 в таблицу с кодировкой utf8. INSERT INTO table_in_utf8 SELECT * FROM table_in_cp1251;
5. Включаем использование ключей ALTER TABLE table_in_utf8 ENABLE KEYS;

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

запускать скрипт можно из консоли `php -f export.php` или через веб.

<\?php

$time = microtime(true);

$db = ‘vspomni’;
$login = ‘vspomni’;
$passw = »;
$host = ‘vspomni.ru’;

$res = mysql_connect($host, $login, $passw);
mysql_select_db($db);

mysql_query(‘SET NAMES utf8;’);

$rs = mysql_query(‘SHOW TABLES;’);
print mysql_error(); //the notorious ‘command out of synch’ message :(
while (($row=mysql_fetch_assoc($rs))!==false) {

$time1 = microtime(true);
//print $row[‘Tables_in_vspomni2’].»\n»;
$table_name = $row[‘Tables_in_’.$db];
$query = ‘SHOW CREATE TABLE ‘.$table_name;

$row_create = mysql_query($query);
print mysql_error();
$row1 = mysql_fetch_assoc($row_create);

if (strpos($row1[‘Create Table’], ‘DEFAULT CHARSET=utf8’) !== false)
{
print ‘Table ‘.$table_name.’ — skipped’.»\n»;
continue;
}

$create_table_scheme = str_ireplace(‘cp1251’, ‘utf8’, $row1[‘Create Table’]); // CREATE TABLE SCHEME
$create_table_scheme = str_ireplace(‘ENGINE=InnoDB’, ‘MyISAM’, $create_table_scheme);
$create_table_scheme .= ‘ COLLATE utf8_bin’;

//print $create_table_scheme;
//continue;

$query = ‘RENAME TABLE ‘.$table_name.’ TO ‘.$table_name.’_tmp_export’; // RENAME TABLE;
mysql_query($query);
$error = mysql_error();
if (strlen($error) > 0)
{
print $error.’ — LINE ‘.__LINE__.»\n»;
break;
}

$query = $create_table_scheme;
mysql_query($query);
$error = mysql_error();
if (strlen($error) > 0)
{
print $error.’ — LINE ‘.__LINE__.»\n»;
break;
}

$query = ‘ALTER TABLE ‘.$table_name.’ DISABLE KEYS’;
mysql_query($query);
$error = mysql_error();
if (strlen($error) > 0)
{
print $error.’ — LINE ‘.__LINE__.»\n»;
break;
}

$query = ‘INSERT INTO ‘.$table_name.’ SELECT * FROM ‘.$table_name.’_tmp_export’;
mysql_query($query);
$error = mysql_error();
if (strlen($error) > 0)
{
print $error.’ — LINE ‘.__LINE__.»\n»;
break;
}

$query = ‘DROP TABLE ‘.$table_name.’_tmp_export’;
mysql_query($query);
$error = mysql_error();
if (strlen($error) > 0)
{
print $error.’ — LINE ‘.__LINE__.»\n»;
break;
}

$time3 = microtime(true);
$query = ‘ALTER TABLE ‘.$table_name.’ ENABLE KEYS’;
mysql_query($query);
$error = mysql_error();
if (strlen($error) > 0)
{
print $error.’ — LINE ‘.__LINE__.»\n»;
break;
}

print ‘Enable keys to ‘.$table_name.’. time -‘.(microtime(true) — $time3).»\n»;
print ‘converted ‘.$table_name.’. time — ‘.(microtime(true) — $time1).»\n\n»;

}
mysql_free_result($rs);

print ‘done. total time -‘.(microtime(true) — $time);
?>

P.S. Сегодня ночью БД проекта вспомни.ру сконвертировал этим скриптом за 17 минут.

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

Может показаться удивительным, но в просвещённом 2020-ом году всё ещё
существуют разработчики, которые полагают, что нет ничего криминального в
использовании кодировки windows-1251 при отдаче с эндпойнта
API контента, содержащего кириллицу. Бог им судья, мне же
пришлось искать способ этот самый контент безболезненно конвертнуть в
благословенный юникод.

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

Итак, берём входящие байты и конвертим их в юникод
(обработка ошибок и прочие закрытия body убраны для краткости).

dec := charmap.Windows1251.NewDecoder()
out, _ := dec.Bytes(a)

var meter dmc.Meter
_ = json.Unmarshal(out, &meter)

log.Print(meter.MeterName)

Что я ожидал увидеть? “ЭЛЕКТРОСНАБЖЕНИЕ”(я кажется, не упоминал,
что работаю в ЖЭКе). А что я увидел? “пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ”

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

Тут меня осенило — если от смены способа перекодировки результат не меняется,
значит, проблема прячется где-то в другом месте. Минут пятнадцать я пытался
понять, могут ли разработчики того самого API присылать в хедере кодировку
Windows-1251, а в тексте что-либо другое, однако Postman убедил меня,
что, по крайней мере, тут всё честно — контент закодирован именно в
Windows-1251. Тогда я решил проследить весь путь данных, от получения до вывода
в консоль и почти сразу принялся драть волосы из бороды,
проклиная собственную тупость.

Следите за руками.
Контент приходит в формате json, такой вот структуры:

{
    "contents": [],
    "result": {
        "code": 1,
        "message": "some message"
    }
}

Поскольку я использую строго типизированный Go, и меня больше интересует не
служебная информация, а тот самый контент, то данные проходят следующую
обработку (я опускаю нерелевантный заметке код):

type Result struct {
	Code    int
	Message string
}

type Response struct {
	Contents []interface{}
	Result   Result
}

content := [][]byte{}

var response Response
_ = json.Unmarshal(res_body, &response)

for _, item := range response.Contents {
    item_bytes, _ := json.Marshal(item)
    content = append(content, item_bytes)
}

И вот этот самый content и есть то, с чем уже можно работать,
маршалить его в структуры, отправлять письмом на деревню дедушке, и т.д.,
но вот тут-то и спряталась ошибка: первый анмаршаллинг пришедших байтов
сконвертил кириллицу в совершенно нечитаемые иероглифы, поскольку
корректно он умеет работать только с юникодом. А далее я получившиеся
каракули собственноручно смаршалил в байты и попытался сконвертировать
заранее нечитаемые символы в юникод и вполне ожидаемо получил на
выходе именно его — говно на лопате.

Как понимаете, после того, как я перенёс перекодирования данных
в самое начало, сразу после после их получения, ситуация исправилась:

resp, _ := client.Get(url)
res_body, _ := ioutil.ReadAll(resp.Body)

dec := charmap.Windows1251.NewDecoder()
out, _ := dec.Bytes(res_body)

content := [][]byte{}

var response Response
err = json.Unmarshal(out, &response)

for _, item := range response.Contents {
    item_bytes, _ := json.Marshal(item)
    content = append(content, item_bytes)
}

// ----

var meter dmc.Meter
_ = json.Unmarshal(out, &meter)

log.Print(meter.MeterName) //--> ЭЛЕКТРОСНАБЖЕНИЕ

Надеюсь, эта заметка поможет вам избежать подобной ошибки.

В общем случае, перекодировать можно в любом направлении, не обязательно именно в utf-8. Можно перекодировать между кириллическими кодировками, например, из koi-8 в cp1251, из utf-8 в koi-8, из utf-8 в cp1251 и обратно. Также рассмотрим ситуацию когда нужно изменить кодировку файлов не только в текущей директории, но и во вложенных.

В Linux перекодировку файлов удобно делать утилитами recode или enconv. Есть и другие перекодировщики, но про них пусть кто-то другой напишет.

Установить recode:

sudo yum install recode

Для использования enconv нужно установить пакет enca:

sudo yum install enca

Обе команды — recode и enconv — имеют кучу возможных опций, в простейших случаях для перекодирования одного или нескольких файлов в одной директории использование такое:

recode cp1251..utf8 myfile.txt
recode cp1251..utf8 *.txt
enconv -L russian -x utf8 myfile.txt
enconv -L russian -x utf8 *.txt

На что следует обратить внимание: для команды recode надо указать направление перекодировки (как минимум, исходную кодировку, в примере это cp1251; если не указана конечная кодировка, то программа заглянет в переменные окружения LC_ALL, LC_CTYPE, LANG). Для enconv указывать направление перекодировки необязательно вообще: программа способна определить исходную кодировку, проанализировав текст файла, а конечная кодировка будет взята из переменных окружения.

То есть, если надо перекодировать файлы в вашу «обычную» кодировку, используемую в системе, примеры могут выглядеть так:

recode cp1251 *.txt

enconv -L russian *.txt

Для того, чтобы программа enconv точнее могла определить исходную кодировку файла, ей можно помочь, подсказав, на каком языке написан текст в файле. В нашем примере указан русский язык: «-L russian».

Список языков, известных программе, можно посмотреть так:

enca --list languages

enca — это не опечатка. Программа enconv является частью пакета enca.

Результат:

 belarusian: CP1251 IBM866 ISO-8859-5 KOI8-UNI maccyr IBM855 KOI8-U
 bulgarian: CP1251 ISO-8859-5 IBM855 maccyr ECMA-113
 czech: ISO-8859-2 CP1250 IBM852 KEYBCS2 macce KOI-8_CS_2 CORK
 estonian: ISO-8859-4 CP1257 IBM775 ISO-8859-13 macce baltic
 croatian: CP1250 ISO-8859-2 IBM852 macce CORK
 hungarian: ISO-8859-2 CP1250 IBM852 macce CORK
 lithuanian: CP1257 ISO-8859-4 IBM775 ISO-8859-13 macce baltic
 latvian: CP1257 ISO-8859-4 IBM775 ISO-8859-13 macce baltic
 polish: ISO-8859-2 CP1250 IBM852 macce ISO-8859-13 ISO-8859-16 baltic CORK
 russian: KOI8-R CP1251 ISO-8859-5 IBM866 maccyr
 slovak: CP1250 ISO-8859-2 IBM852 KEYBCS2 macce KOI-8_CS_2 CORK
 slovene: ISO-8859-2 CP1250 IBM852 macce CORK
 ukrainian: CP1251 IBM855 ISO-8859-5 CP1125 KOI8-U maccyr
 chinese: GBK BIG5 HZ
 none:

Как перекодировать файлы из/в utf-8, cp1251, koi8 и т. д. рекурсивно в поддиректориях

Для рекурсивного изменения кодировки файлов надо привлечь команду find, затем перекодировать то, что она нашла.

Среди множества опций команды find имеется набор для выполнения действий над найденными файлами. Нас интересует опция «-exec command {} ;».

Здесь:

command — команда, которую надо выполнить для каждого найденного файла;

{} — вместо скобок будет подставлено имя файла, найденного командой find;

; — точка с запятой указывает для команды find, в каком месте заканчиваются параметры команды command.

Надо иметь в виду, что «{}» и «;» может понадобиться экранировать с помощью одинарных кавычек или «\», чтобы предотвратить интерпретацию командной оболочкой (shell expansion).

Собираем всё вместе. Чтобы перекодировать из cp1251 (windows-1251) в utf-8 рекурсивно в поддиректориях все файлы, имена которых заканчиваются на ‘.txt’, надо выполнить:

find /path/to/dir -name '*.txt' -exec recode cp1251..utf8 '{}' \;

или

find /path/to/dir -name '*.txt' -exec enconv -L russian -x utf8 '{}' \;

Ура!

Понравилась статья? Поделить с друзьями:
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
  • Fail2ban аналог для windows
  • Ilo channel interface driver windows server 2016
  • Windows server vs red hat
  • Форум оптимизация windows 10
  • Журнал событий windows сервер