Ваш файл выглядит в кодировке UTF-8, но вы читаете его, как если бы он был в однобайтовой кодировке, такой как windows-1252. UTF-8 использует три байта для кодирования каждого из этих символов, но когда вы декодируете его как windows-1252, каждый байт обрабатывается как отдельный символ.
При работе с текстом всегда следует указывать кодировку, если это возможно; не позволяйте системе использовать кодировку по умолчанию. В Java это означает использование InputStreamReader и OutputStreamWriter вместо FileReader и FileWriter. Любой достаточно хороший текстовый редактор должен также указывать кодировку.
Что касается вашего фактического вопроса, нет, в Java нет встроенного средства для динамических замен (в отличие от большинства других разновидностей регулярных выражений). Но не так уж сложно написать свой или, еще лучше, использовать тот, который написал кто-то другой. Я отправил сообщение от Эллиотта Хьюза в этот ответ .
И еще одна вещь: в вашем примере кода вы используете replaceAll()
для замены, что является чрезмерным убийством и возможным источником ошибок. Поскольку вы сопоставляете буквенный текст, а не регулярные выражения, вместо этого следует использовать replace(CharSequence,CharSequence)
. Таким образом, вам никогда не придется беспокоиться о случайном включении метасимвола регулярных выражений и переходе в тупик.