查找和替换文件中的特殊字符



我正在尝试查找并替换以 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 编码?这是我所做的:

  1. 我从您的问题中获取文件内容并将其保存(使用 SublimeText)保存到文件/tmp/test.txt使用 Save ->使用编码保存 -> Western (ISO 8859-1)

  2. 我使用以下 Linux 命令检查了文件编码:

    file -i /tmp/test.txt
    /tmp/test.txt: text/plain; charset=iso-8859-1
    
  3. 我用/tmp/test.txt文件设置了dumpfile变量,并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. 我在IntelliJ IDEA中检查了Groovy文件的编码 - 它是UTF-8

  6. 我检查了输出文件的编码:

    file -i /tmp/test_2.txt
    /tmp/test_2.txt: text/plain; charset=utf-8
    
  7. 我检查了输出文件的内容:

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

希望它有助于找到问题的根源。

最新更新