Как заменить кодировки в спец символы

Есть текстовый файл test.txt с кодировкой:

! 

€ 

✖

ы

и тд

Как перевести эти кодировки в соответствующие им символы: ! € ✖ ы и тд

Пробовал вручную командой sed -i -e 's/ы/ы/g' test.txt Всё работает, но таких символов больше тысячи. Такая работа займет больше дня.


Ответы (2 шт):

Автор решения: gil9red

Через это можно в несколько строк сделать.

Алгоритм:

  • Использование одной кодировка, пусть будет utf-8
  • Открыть файл на считывание (f_in)
  • Открыть другой файл на запись (f_out). Можно и в тот же файл сделать запись, но, думаю, лучше в новый, чтобы не делать потом бэкапы
  • Через встроенную библиотеку html выполняется замена: https://docs.python.org/3/library/html.html#html.unescape

Пример:

import html

with open('test.txt', encoding='utf-8') as f_in, \
        open('new_test.txt', 'w', encoding='utf-8') as f_out:
    text = f_in.read()
    f_out.write(html.unescape(text))

test.txt:

!
Hello
€
Мир
✖
!
ы

new_test.txt:

!
Hello
€
Мир
✖
!
ы
→ Ссылка
Автор решения: Drakonoved

В Java есть специальная библиотека для работы с текстом:

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-text</artifactId>
    <version>1.8</version>
</dependency>

Пример использования:

public static void main(String[] args) throws Exception {
    soutUnescaped("&#33;");
    soutUnescaped("&#8364;");
    soutUnescaped("&#8364;");
    soutUnescaped("&#1099;");

    // !
    // €
    // €
    // ы
}

private static void soutUnescaped(String escapedString) {
    System.out.println(StringEscapeUtils.unescapeHtml4(escapedString));
}
→ Ссылка