我正在尝试查找并替换以 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()
}
}
我的输入文件内容是:
"þ": "ý": "þ":" "ð":" ">ý":" "ð":">
问题是我的代码从未找到指定的字符。时髦的脚本文件本身以 UTF-8 编码。我猜这可能是问题的原因,但是我无法在ISO-8859-1中对其进行编码,因为那样我就无法在其中写入" Ş" Ğ" 等。
我拿了你的代码样本,使用用字符集 ISO-8859-1 编码的输入文件运行它,它按预期工作。您能否仔细检查您的输入文件是否实际使用 ISO-8859-1 编码?这是我所做的:
-
我从您的问题中获取文件内容并将其保存(使用 SublimeText)保存到文件
/tmp/test.txt
使用 Save ->使用编码保存 -> Western (ISO 8859-1) -
我使用以下 Linux 命令检查了文件编码:
file -i /tmp/test.txt /tmp/test.txt: text/plain; charset=iso-8859-1
-
我用
/tmp/test.txt
文件设置了dumpfile
变量,并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!
-
我在IntelliJ IDEA中检查了Groovy文件的编码 - 它是UTF-8
-
我检查了输出文件的编码:
file -i /tmp/test_2.txt /tmp/test_2.txt: text/plain; charset=utf-8
-
我检查了输出文件的内容:
cat /tmp/test_2.txt "ş": "ı": "Ş":" "ğ":" "İ":" "Ğ":"
我认为这并不重要,但我使用了最新的 Groovy2.4.13
我猜您的输入文件未正确编码。请仔细检查文件的编码 - 当我保存相同的内容但使用 UTF-8 编码时,您的程序无法按预期工作,并且在控制台中看不到任何found a special char!
条目。当我显示ISO-8859-1文件的内容时,我看到类似的东西:
cat /tmp/test.txt
"�": "�": "�":" "�":" "�":" "�":"%
如果我使用 UTF-8 保存相同的内容,我会看到文件的可读内容:
cat /tmp/test.txt
"þ": "ý": "Þ":" "ð":" "Ý":" "Ð":"%
希望它有助于找到问题的根源。