Поиск и замена специальных символов в файле

Я пытаюсь найти и заменить некоторые специальные символы в файле, закодированном в 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, потому что тогда я не могу написать в нем «Ş», «Ğ» и т. д.


person uylmz    schedule 06.02.2018    source источник


Ответы (1)


Я взял ваш образец кода, запустил его с входным файлом, закодированным с помощью набора символов ISO-8859-1, и он сработал, как и ожидалось. Можете ли вы дважды проверить, действительно ли ваш входной файл закодирован с помощью ISO-8859-1? Вот что я сделал:

  1. Я взял содержимое файла из вашего вопроса и сохранил его (используя SublimeText) в файл /tmp/test.txt, используя Сохранить -> Сохранить с кодировкой -> Western (ISO 8859-1)

  2. Я проверил кодировку файла с помощью следующей команды Linux:

    file -i /tmp/test.txt
    /tmp/test.txt: text/plain; charset=iso-8859-1
    
  3. Я установил переменную dumpfile с файлом /tmp/test.txt и переменной newfile на /tmp/test_2.txt

  4. Запускаю ваш код и вижу в консоли:

    found a special char!
    found a special char!
    found a special char!
    found a special char!
    found a special char!
    found a special char!
    
  5. Я проверил кодировку файла Groovy в IntelliJ IDEA - это была UTF-8

  6. Я проверил кодировку выходного файла:

    file -i /tmp/test_2.txt
    /tmp/test_2.txt: text/plain; charset=utf-8
    
  7. Я проверил содержимое выходного файла:

    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
"þ": "ý": "Þ":" "ð":" "Ý":" "Ð":"%  

Надеюсь, это поможет найти источник проблемы.

person Szymon Stepniak    schedule 06.02.2018