Java - независимый от платформы Howto выход

Я хотел бы знать, как позволить моему коду выводить один и тот же вывод (UTF-8 или UTF16) на разных платформах (по крайней мере, Windows и Linux).
Я думал, что было возможно установить кодовую страницу для использования приложением, но я не могу найти информацию для установки кодовой страницы. И я не знаю, будет ли установка кодовой страницы действительно давать такой же вывод при использовании специальных символов, таких как äöü или других нелатинских символов.

Я хотел бы иметь решение, которое работает без установки аргументов для java.exe.

Редактировать:
Я имею ввиду вывод на консоль. Комментарий о возможных эффектах на другие средства вывода был бы хорош.

2 ответа

Кодировка (или кодовая страница, как ее называли) преобразует последовательность символов в последовательность байтов.

В Java API кодировки реализованы как подклассы Charset, Все элементы API, которые преобразуются между символами и байтами, могут быть предоставлены для использования с набором символов (многие также позволяют вместо этого передавать имя набора символов, поэтому вам не придется выполнять поиск самостоятельно). Если вы не предоставите кодировку, эти методы обычно возвращаются к кодировке операционной системы по умолчанию.

Например, OutputStreamWriter имеет конструктор, который принимает кодировку:

try (Writer w = new OutputStreamWriter(System.out, "utf-8")) {
    w.write("Hello world");
}

Ява char type использует UTF-16, который способен представлять каждую кодовую точку в наборе символов Unicode. Практически все операции ввода-вывода, в которых используются строки, включают неявную операцию перекодирования.

Для сохранения и восстановления символьных данных без потери или повреждения лучше всего использовать один из форматов преобразования Unicode. Существуют типы чтения и записи, которые можно использовать для выполнения этой операции транскодирования. Избегайте конструкторов по умолчанию, поскольку они полагаются на кодировку по умолчанию, которая может быть устаревшей кодировкой, лучше всего подходящей для прошлых десятилетий. Явное указание UTF-8 обычно является предпочтительным.

Есть разные проблемы с записью в терминал. Здесь вы пишете данные, которые будут декодированы другим приложением, поэтому вы должны записывать символьные данные в понятном им формате.

Console type обнаружит и использует кодировку терминала, тогда как System.out использует кодировку платформы по умолчанию - они отличаются в Windows по ряду исторических причин. Другие различия отмечены здесь. Документированный способ использования Unicode в cmd.exe - это использование соответствующих вызовов Win32 API.

Некоторые соответствующие посты из моего блога:

BalusC также есть хороший пост по некоторым практическим вопросам обработки символов: Юникод - Как правильно настроить символы?

Другие вопросы по тегам