Свойства Java в кодировке UTF-8 в Eclipse

Я недавно был переключатель кодирования веб - приложение , я работаю от ISO-xxдо utf8. Все прошло гладко, кроме файлов свойств. Я добавил -Dfile.encoding=UTF-8в eclipse.iniи нормальные файлы работают нормально. Свойства однако показывают некоторое странное поведение.

Если я копирую utf8закодированные свойства из Notepad ++ и вставляю их в Eclipse, они отображаются и работают нормально. Когда я снова открываю файл свойств, я вижу некоторые символы Юникода вместо правильных, например:

Zur\u00EF\u00BF\u00BDck instead of Zurück

но приложение все еще работает нормально. Если я начинаю редактировать свойства, добавляю некоторые специальные символы и сохраняю, они отображаются правильно, однако они не работают, и все ранее работавшие специальные символы больше не работают.

Когда я сравниваю локальную версию с CVS, я правильно вижу специальные символы в удаленном файле, и после обновления я снова запускаюсь: приложение работает, но Eclipse отображает символы Unicode.

Я попытался изменить кодировку файла, щелкнув правой кнопкой мыши и выбрав «Другое: UTF8», но это не помогло. Также сказано: «определено по содержанию: ISO-8859-1»

Я использую Java 6 и Jboss Developer на основе Eclipse 3.3

Я могу жить с этим, редактируя свойства в Notepad ++ и вставляя их в Eclipse, но я был бы признателен, если бы кто-то мог помочь мне исправить это в Eclipse.

14.05.2009 14:59:47
12 ОТВЕТОВ
РЕШЕНИЕ

Не тратьте свое время, вы можете использовать плагин Resource Bundle в Eclipse

Основной снимок экрана

Старая страница Sourceforge

54
27.05.2015 15:46:08
Это очень полезный плагин, спасибо за совет! Так плохо, что у него нет URL-адреса для установки, но просто сбросив его в папку с плагинами, добьется цели.
chesterbr 7.01.2010 04:43:47
Использует ли это инструмент native2ascii для внутренних символов, отличных от Юникода, или я должен вручную экранировать символы Юникода?
Ivaylo Slavov 21.11.2011 12:05:40
@ baybora.oren: Я расширил .zip в плагине папки eclipse, но не вижу никаких изменений в ide (я выключаю и перезапускаю eclipse). Любой намек?
Sefran2 11.06.2014 15:17:01
Версия затмения @cricket check может быть не совместима с тем затмением, которое вы используете
baybora.oren 3.07.2014 12:08:18

Файлы свойств по ISO-8859-1 по определению - см. Документацию по классу свойств .

Spring имеет замену, которую можно загрузить с указанной кодировкой, используя PropertiesFactoryBean.

РЕДАКТИРОВАТЬ: Как отметил Лоуренс в комментариях, Java 1.6 представил перегрузки для loadи storeкоторые принимают Reader/ Writer. Это означает, что вы можете создать читатель для файла с любой кодировкой и передать его load. К сожалению, по- FileReader прежнему не позволяет вам указать кодировку в конструкторе (аааа), поэтому вы застрянете в цепочке FileInputStreamи InputStreamReaderвместе. Тем не менее, это будет работать.

Например, чтобы прочитать файл с использованием UTF-8:

Properties properties = new Properties();
InputStream inputStream = new FileInputStream("path/to/file");
try {
    Reader reader = new InputStreamReader(inputStream, "UTF-8");
    try {
        properties.load(reader);
    } finally {
        reader.close();
    }
} finally {
   inputStream.close();
}
65
4.02.2013 06:48:08
В Java 1.6 вы можете использовать другие кодировки, используя методы, которые используют Reader / Writer вместо InputStream / OutputStream.
Laurence Gonsalves 14.05.2009 15:10:14
Более общее решение, чем в принятом ответе, поэтому лучше :)
Radu Murzea 2.02.2013 19:28:22
@JonSkeet Я работаю над этой проблемой уже несколько недель. Спасибо огромное!
Fering 18.03.2019 18:37:16

Это не проблема с Eclipse. Если вы используете класс Properties для чтения и сохранения файла свойств, класс будет экранировать все специальные символы.

Из документации класса:

При сохранении свойств в поток или загрузке их из потока используется кодировка символов ISO 8859-1. Для символов, которые не могут быть непосредственно представлены в этой кодировке, используются экранированные символы Юникода; однако в escape-последовательности допускается только один символ 'u'. Инструмент native2ascii можно использовать для преобразования файлов свойств в другие кодировки и из них.

Из API, метод store ():

Символы меньше \ u0020 и символы больше \ u007E записываются как \ uxxxx для соответствующего шестнадцатеричного значения xxxx.

12
14.05.2009 15:03:52
Я был просто skeet'd ... :(
Mario Ortegón 14.05.2009 15:04:18
NetBeans прекрасно отображает файлы свойств, которые имеют экранирование \ uXXXX, и позволяет редактировать их с правильно отображаемыми символами UTF. Почему не Затмение? На мой взгляд , это является проблемой с Eclipse.
ChrisB 19.02.2014 14:22:52
+1: такой квант утешения за то, что он был skeet'd
rexford 22.09.2014 13:03:17

В описываемом вами процессе слишком много точек, где могут возникать ошибки, поэтому я не буду пытаться угадать, что вы делаете неправильно, но я думаю, что знаю, что происходит под капотом.

EF BF BDявляется кодированной формой UTF-8 U+FFFD, стандартным символом замены, который вставляется декодерами, когда они сталкиваются с искаженным вводом. Похоже, ваш текст сохраняется как ISO-8859-1, затем читается как UTF-8, затем сохраняется как UTF-8, а затем преобразуется в формат свойств с native2asciiиспользованием кодировки по умолчанию платформы (например, windows-1252 ).

ü => 0xFC // сохранить как ISO-8859-1
0xFC => U + FFFD // читается как UTF-8
U + FFFD => 0xEF 0xBF 0xBD // сохранить как UTF-8
0xEF 0xBF 0xBD => \ u00EF \ u00BF \ u00BD // native2ascii

Я предлагаю вам оставить свойство file.encoding в покое. Как и «file.separator» и «line.separator», это не так полезно, как можно было бы ожидать. Вместо этого, вы должны всегда указывать кодировку при чтении и записи текстовых файлов.

4
15.05.2009 01:03:25

Кажется, это работает только для некоторых символов ... включая специальные символы для немецкого, португальского и французского языков. Однако у меня возникли проблемы с русскими, хинди и мандаринскими персонажами. Они не конвертируются в формат свойств 'native2ascii', а сохраняются с ?? ?? ??
Единственный способ заставить мое приложение правильно отображать эти символы - поместить их в файл свойств, переведенный в формат UTF-8 - как \ u0915 вместо क или \ u044F вместо я. Любой совет?

1
7.10.2009 17:37:28
Вы можете использовать Spring org.springframework.context.support.ReloadableResourceBundleMessageSource, который поддерживает файлы свойств в кодировке UTF-8. Мы используем Spring для управления переводами на английский, немецкий, французский и китайский языки в веб-приложениях на основе Spring-MVC.
rexford 22.09.2014 13:11:07
Properties props = new Properties();
URL resource = getClass().getClassLoader().getResource("data.properties");         
props.load(new InputStreamReader(resource.openStream(), "UTF8"));

Работает как шарм

:-)

10
14.06.2010 20:44:01
К сожалению, props.load в версии 1.6 требует InputStream и конкретно указывает на то, что он ожидает старой школы ISO-8859-1
user153275 9.10.2011 15:35:11
Properties props = new Properties();
URL resource = getClass().getClassLoader().getResource("data.properties");         
props.load(new InputStreamReader(resource.openStream(), "UTF8"));

это хорошо работает в Java 1.6. Как я могу сделать это в 1.5, так как класс свойств не имеет метода для парсинга InputStreamReader.

4
6.04.2012 11:33:22

Еще один плагин Eclipse для файлов * .properties:

Редактор свойств

3
15.02.2011 08:52:25

Если свойства предназначены для XML или HTML, безопаснее всего использовать объекты XML. Их читать сложнее, но это означает, что файл свойств может рассматриваться как прямой ASCII, поэтому ничего не будет искажено.

Обратите внимание, что в HTML есть объекты, которых нет в XML, поэтому я сохраняю их, используя прямой XML: http://www.w3.org/TR/html4/sgml/entities.html

-1
21.04.2011 21:37:16

Я рекомендую вам использовать Attesoro ( http://attesoro.org/ ). Прост и удобен в использовании. И сделано в Java.

1
11.10.2011 13:30:37

Есть гораздо более простой способ:

props.load(new InputStreamReader(new FileInputStream("properties_file"), "UTF8"));
4
21.11.2012 17:26:14

Вы можете определить файлы UTF-8 .properties для хранения ваших переводов и использовать ResourceBundle для получения значений. Чтобы избежать проблем, вы можете изменить кодировку:

String value = RESOURCE_BUNDLE.getString(key); 
return new String(value.getBytes("ISO-8859-1"), "UTF-8");
2
9.07.2014 09:29:37