Автор Тема: Чтение "кракозябр" от windows  (Прочитано 2251 раз)

Оффлайн kras

  • Завсегдатай
  • *
  • Сообщений: 74
  Иногда прилетает из сети файлы с неправильной, перевернутой кодировкой. Решив ребус, написал небольшую программку c3del и батч-файлом c3d. Вот что получилось:
// c3del.c program *********************************

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
  FILE *fp, *fp2;
  char ch;

  if(argc!=2) {
    printf("\n Нужно ввести имя файла [text.txt].\n\n");
printf(" Программа c3del исправляет ошибки перевода из windows-1251 кодировки в UTF-8, например строка: 'Ãîñòèíèöà.wav' => 'Гостиница.wav'\n");
printf("Версия от\n 11.07.2020\n");
    printf("\n Пример использования:\n./c3del text.txt > tmp.txt; recode windows-1251 tmp.txt; mv tmp.txt text.txt -f; rm tmp.txt -f; dos2unix text.txt; cat text.txt\n");
    exit(1);
  }


  if((fp=fopen(argv[1], "r"))==NULL) {
    printf("Ошибка при открытии файла.\n");
    exit(1);
  }

ch = getc(fp);   /* чтение одного символа */
while (ch!=EOF) {
if (ch==-61) { // Избавляемся от 0xC3 символов
ch = getc(fp); // Чтение второго символа
putchar(ch+0x40); // Повышение на 64 ступени кода
ch = getc(fp); // Чтение для нового цикла
}
else {
if ((0x20 <= ch) && (ch <= 0x7e)) {
putchar(ch); // печать начала таблицы
ch = getc(fp);
}
else {
if (ch==0x0A) {
putchar(0x0D); // Возвращаем недостающий 0xD0
putchar(ch);
ch = getc(fp);
}
else ch = getc(fp);
}
}
}

  fclose(fp);

  return 0;
}

//gcc c3del.c -o c3del
//./c3del text.txt > tmp.txt; recode windows-1251 tmp.txt; mv tmp.txt text.txt -f; rm tmp.txt -f; dos2unix text.txt; cat text.txt

// c3del program *********************************

В подсказке приводится пример.

# c3d batch file **************************
#!/bin/bash
c3del $1 > tmp.txt; recode windows-1251 tmp.txt; mv tmp.txt $1 -f; rm tmp.txt -f; dos2unix $1; cat $1
# c3d batch file **************************

Необходимы в системе проинсталлированные программы recode и dos2unix.

Запуск программки:
$ c3d filename(.txt)
Итог - на экран выводится раскодированный текст из преобразованного файла-исходника.
« Последнее редактирование: 01.07.2021 10:17:22 от kras »

Оффлайн Skull

  • Глобальный модератор
  • *****
  • Сообщений: 19 908
    • Домашняя страница
    • Email
Re: Чтение "кракозябр" от windows
« Ответ #1 : 01.07.2021 09:23:22 »
Есть готовые программы в репозитории.
Андрей Черепанов (cas@)

Оффлайн kras

  • Завсегдатай
  • *
  • Сообщений: 74
Re: Чтение "кракозябр" от windows
« Ответ #2 : 01.07.2021 10:34:18 »
Есть готовые программы в репозитории.
Программы выправляющие ошибки перекодирования? Обычно программы строго конвертируют, а здесь - выправление ошибки преобразований.
Хотелось бы названия альтернатив, если не так.

Оффлайн Александр Ерещенко

  • Завсегдатай
  • *
  • Сообщений: 1 153
Re: Чтение "кракозябр" от windows
« Ответ #3 : 01.07.2021 11:50:51 »
Для офисных документов на эту тему есть расширение для LibreOffice/OpenOffice - cyrtools (старенькое, но работает) - добавляет меню "Кириллический документ", где есть ряд полезных функций, в том числе перекодировка "из латиницы в кириллицу".

Это в первую очередь для древних документов, созданных ещё в MS Office 95.
Да и в 97-м русском офисе, кажется, был глюк сохранения в .rtf, когда в rtf-файле для шрифтов прописывалась кодовая таблица 0 вместо нужной. Сам русский MSOffice это нормально отображает как нормальную кириллицу, а вот английский MSOffice и LibreOffice/OpenOffice честно отображали символы в 0-й таблице юникодовских символов (как указано), т.е. "кракозябрами".
« Последнее редактирование: 01.07.2021 11:52:31 от Александр Ерещенко »

Оффлайн trs

  • Давно тут
  • **
  • Сообщений: 284
Re: Чтение "кракозябр" от windows
« Ответ #4 : 06.07.2021 05:06:47 »
  char ch;  // char может быть как signed, так и unsigned (не определено стандартом)
/* ... */
if (ch==-61) { // автор подразумевает, что тип знаковый
/* ... */
}
else {
if ((0x20 <= ch) && (ch <= 0x7e)) { // если тип знаковый, то 0x80 .. 0xff < 0x7e
/* ... */
А комментатор первое сравнений в упор не видит.  :-o

Удаляю предыдущее сообщение, а это пусть висит в качестве иллюстрации на тему "когнитивная слепота и что с ней делать".  ;-D

Оффлайн asy

  • alt linux team
  • ***
  • Сообщений: 8 099
Re: Чтение "кракозябр" от windows
« Ответ #5 : 06.07.2021 16:59:48 »
Есть готовые программы в репозитории.
А вот какие кстати? Есть один файлик, выгружается из древней MySQL, никак не подберу, что сказать iconv... Я даже слово знаю, которое там написано. :-)

Оффлайн Skull

  • Глобальный модератор
  • *****
  • Сообщений: 19 908
    • Домашняя страница
    • Email
Re: Чтение "кракозябр" от windows
« Ответ #6 : 06.07.2021 20:04:28 »
Есть готовые программы в репозитории.
А вот какие кстати? Есть один файлик, выгружается из древней MySQL, никак не подберу, что сказать iconv... Я даже слово знаю, которое там написано. :-)
fuse-convmvfs - FUSE-Filesystem to convert filesystem encodings
convmv - convmv перекодирует названия файлов
enconvmv - convmv meets enca
Подбирать кодировки надо в онлайновых службах типа http://foxtools.ru/Text
Андрей Черепанов (cas@)