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

Как преобразовать текстовый файл со смесью кодировок в одну кодировку?
  1. Я создал текстовый файл, скопировав его различные части из разных источников (веб-страницы, другие текстовые файлы, файлы PDF) в gedit и сохранив его в файле. Думаю, это причина того, что у меня несколько кодировок в текстовом файле, но я не уверен. Как мне избежать создания текстового файла со смешанными кодировками, скопировав его различные части из разных источников в gedit?
  2. Всякий раз, когда я открываю файл в gedit, gedit всегда может правильно показать или декодировать каждую часть текста. Кажется, что gedit может обрабатывать текстовый файл со смешанными кодировками, но я не уверен.

    Но когда я открываю файл в emacs, там появляются символы, которые не могут быть отображены правильно. (Я не уверен, почему emacs не может этого сделать.) Поэтому я хотел бы преобразовать файл из смешанных кодировок в одну кодировку, например, utf-8.

    Поскольку я думаю, что gedit может определять правильные кодировки для различных частей текстового файла, и я не знаю, есть ли другие приложения, которые могут это делать, можно ли попросить gedit преобразовать файл в utf-8 или хотя бы сообщить мне, какую кодировку он находит для какой части файла?

Спасибо.

решение1

Хм... концепция файла с разной кодировкой, честно говоря, несколько шаткая. Если у вас есть немного времени,Эта статьяВот этот) стоит прочитать.

Для Linux файл — это последовательность байтов. Если вы попросите программу интерпретировать его как текстовый файл, она сделает это, используя сопоставление между байтами и символами; это сопоставление и есть кодировка. Почти все известные мне текстовые редакторы (не текстовые процессоры!) просто понимают концепцию одной кодировки для одного файла.

Я не эксперт в этом gedit; возможно, он делает какую-то магию, например, пытается автоматически определить кодировку строка за строкой или текстовый блок за текстовым блоком... если это так, вы можете попробовать сделать то же самое, используяenca(1):

 while read line; do echo $line | enconv -L none -x utf8; done < text.mixed > text.utf8

...но это зависит от того, насколько хорошо enca распознает вашу кодировку (например, она почти хорошо работает с восточноевропейской, но не с Latin1).

(1) Он есть в репозиториях, просто установите его с помощью sudo apt-get enca.

решение2

У меня была та же проблема, и я решил ее с помощью Emacs. Решение цитируется здесьздесь:

Другое возможное решение — пометить каждую область, появляющуюся с помощью китайских иероглифов, и перекодировать ее с помощью Mx recode-region, указав «Текст действительно был в» как utf-16-le, а «Но был интерпретирован как» как utf-16-be.

Другой способ — разделить две части с разными кодировками, скопировать их в разные файлы, преобразовать кодировку одной и добавить ее в другую. В моем случае это сработало с Atom, но не с Notepad++ (utf16-le/be).

Связанный контент