Gradle/Ant 合併檔案編碼問題

Joe Satriani

使用 Ant 或 Gradle 合併多個檔案時,因為檔案內含中文字導致編碼問題。

問題

我有一支合併檔案的 task 如下:

將 data 下的 SQL 檔合併成 output 內的 result.sql
1
2
3
4
5
6
7
8
9
10
11
task concatsql(type: SourceTask) {
delete 'output/result.sql'
source 'data'
include '*.sql'
outputs.file new File("output", "result.sql")
doLast {
ant.concat(destfile: outputs.files.singleFile) {
source.addToAntBuilder(ant, 'fileset', FileCollection.AntType.FileSet)
}
}
}

因為 SQL 檔內容包含中文字,導致輸出的內容會有亂碼,而這支 Gradle,其實底層是使用 Ant 的 cancat 功能,所以同理,使用 Ant 去跑也會出現一樣的問題。

基礎知識

好像也沒什麼基礎知識,就是 encoding 的問題。

Ant 可以加入 encodingoutputencoding屬性,請參考How to encode Java files in UTF-8 using Apache Ant?

解決方法

首先將原始檔案儲存為 UTF-8 編碼,並在呼叫 ant.concat 時,加入 encodingoutputencoding設定。

1
2
3
4
5
6
7
8
9
10
11
12
task concatsql(type: SourceTask) {
delete 'output/result.sql'
source 'data'
include '*.sql'
outputs.file new File("output", "result.sql")
doLast {
ant.concat(destfile: outputs.files.singleFile, encoding:"UTF-8",
outputencoding: "UTF-8") {
source.addToAntBuilder(ant, 'fileset', FileCollection.AntType.FileSet)
}
}
}
Share Comments