Поиск и замена специальных символов в файле
Я пытаюсь найти и заменить некоторые специальные символы в файле, закодированном в ISO-8859-1, а затем записать результат в новый файл, закодированный в UTF-8:
package inv
class MigrationScript {
static main(args) {
new MigrationScript().doStuff();
}
void doStuff() {
def dumpfile = "path to input file";
def newfileP = "path to output file"
def file = new File(dumpfile)
def newfile = new File(newfileP)
def x = [
"þ":"ş",
"ý":"ı",
"Þ":"Ş",
"ð":"ğ",
"Ý":"İ",
"Ð":"Ğ"
]
def r = file.newReader("ISO-8859-1")
def w = newfile.newWriter("UTF-8")
r.eachLine{
line ->
x.each {
key, value ->
if(line.find(key)) println "found a special char!"
line = line.replaceAll(key, value);
}
w << line + System.lineSeparator();
}
w.close()
}
}
Содержание моего входного файла:
"þ": "ý": "Þ": "" ð ":" "Ý": "" Ð ":"
Проблема в том, что мой код никогда не находит указанные символы. Сам файл скриптов groovy кодируется в UTF-8. Я предполагаю, что это может быть причиной проблемы, но тогда я не могу закодировать ее в ISO-8859-1, потому что тогда я не могу написать "Ş", "Ğ" и т. Д.
1 ответ
Я взял ваш пример кода, запустил его с входным файлом, закодированным с помощью кодировки ISO-8859-1, и он работал как положено. Можете ли вы дважды проверить, действительно ли ваш входной файл закодирован в соответствии с ISO-8859-1? Вот что я сделал:
Я взял содержимое файла из вашего вопроса и сохранил его (используя SublimeText) в файл
/tmp/test.txt
используя Save -> Save with Encoding -> Western (ISO 8859-1)Я проверил кодировку файла с помощью следующей команды Linux:
file -i /tmp/test.txt /tmp/test.txt: text/plain; charset=iso-8859-1
Я настроил
dumpfile
переменная с/tmp/test.txt
файл иnewfile
переменная к/tmp/test_2.txt
Я запустил ваш код и увидел в консоли:
found a special char! found a special char! found a special char! found a special char! found a special char! found a special char!
Я проверил кодировку файла Groovy в IntelliJ IDEA - это был UTF-8
Я проверил кодировку выходного файла:
file -i /tmp/test_2.txt /tmp/test_2.txt: text/plain; charset=utf-8
Я проверил содержимое выходного файла:
cat /tmp/test_2.txt "ş": "ı": "Ş":" "ğ":" "İ":" "Ğ":"
Я не думаю, что это имеет значение, но я использовал самый последний Groovy 2.4.13
Я предполагаю, что ваш входной файл не закодирован должным образом. Проверьте дважды, что такое кодировка файла - когда я сохраняю тот же контент, но с кодировкой UTF-8, ваша программа не работает должным образом, и я не вижу никакой found a special char!
запись в консоли. Когда я отображаю содержимое файла ISO-8859-1, я вижу что-то вроде этого:
cat /tmp/test.txt
"�": "�": "�":" "�":" "�":" "�":"%
Если я сохраняю тот же контент в UTF-8, я вижу читаемый контент файла:
cat /tmp/test.txt
"þ": "ý": "Þ":" "ð":" "Ý":" "Ð":"%
Надеюсь, что это помогает в поиске источника проблемы.