2015-06-20 2 views
2

Я стараюсь читать свойства из файла с умляутов, это мой build.gradle:Gradle использует неправильную кодировку (Latin-1) для файла свойств

task utf8test << { 

    Properties props = new Properties() 
    def propFile = new File("my.property") 
    if (propFile.canRead()) { 
     props.load(new FileInputStream(propFile)) 
     for (Map.Entry property in props) { 
       println property.value 
     } 
    } 
} 

Моя недвижимость-файл выглядит следующим образом (UTF-8 закодированы):

challenge: ö 

Если я выполнить задачу с: gradle utf8test результат выглядит

:utf8test 
ö 

BUILD SUCCESSFUL 

Total time: 0.877 secs 

«ö» изменяется на «Ã¶», что легко понять. «ö» как шестнадцатеричный c3b6, а c3 в латинском-1 - Ã, а b6 - ¶, но это не то, что я ожидал.

Вопрос: Как я могу настроить Gradle читать в свойствах, как UTF-8 кодируются

Больше информации:

Если я распечатать содержимое propFiles в Gradle с:

println propFile.text 

Я получаю «ö» в качестве вывода, поэтому файл читается правильно, а выход закодирован правильно моей оболочкой.

Gradle-демон работает с: -Dfile.encoding = UTF-8

Выполнение Gradle с -Dfile.encoding = UTF-8: gradle utf8test -Dfile.encoding=UTF-8 не помогает, и не export GRADLE_OPTS="-Dfile.encoding=UTF-8" в Баш, а также не добавляя к systemProp.file.encoding=utf-8 gradle.properties.

Мне не удалось найти страницу документации для класса Properties-Class в градиенте, есть ли опция для настройки кодировки?

Большое спасибо!

ответ

5

Ожидается, и это не имеет никакого отношения к градиенту. documentation of java.util.Properties (который не имеет ничего общего с Gradle, но является стандартным классом JDK) явно указывает, что стандартная кодировка файла свойств - ISO-8859-1. Если вы только один, чтобы прочитать файл и хотите его содержать UTF-8, то явно прочитал его как UTF-8:

Properties props = new Properties() 
def propFile = new File("my.property") 
if (propFile.canRead()) { 
    props.load(new InputStreamReader(new FileInputStream(propFile), StandardCharsets.UTF_8)); 
    for (Map.Entry property in props) { 
      println property.value 
    } 
} 
+0

Спасибо за этот идеальный ответ! И для того, чтобы связать меня с java-документацией! – Murmel

Смежные вопросы