Charset.defaultCharset () получают разные результаты в JDK1.7 и JDK 1.6 - PullRequest
8 голосов
/ 18 ноября 2011

Я проверяю совместимость i18n моего приложения. У меня есть английская версия Windows 7, что означает, что язык системы отображается на английском языке. И я установил системный языковой стандарт как китайский для приложений, не поддерживающих Юникод.

Мое приложение столкнулось с проблемами при экспорте файлов HTML с китайскими иероглифами под jdk1.6, но отлично работает при работе под jdk1.7.

Я отладил его и обнаружил, что прямая причина в том, что Charset.defaultCharset() вернул разные значения.

Под jdk1.7 Charset.defaultCharset() возвращено GBK, которое является кодировкой для китайского языка.

Под jdk1.6 Charset.defaultCharset() возвращается window_1252, что является кодировкой для латинского языка.

Я знаю, что проблему можно решить, назначив кодировку, скажем, utf-8, в коде.

Но я хочу знать, почему Charset.defaultCharset() возвращает разные значения в JDK1.7 и JDK 1.6.

Ответы [ 2 ]

3 голосов
/ 07 февраля 2012

Техническое замечание Java 7 говорит:

Поддерживаемые кодировки варьируются в разных реализациях платформы Java, Standard Edition 7 (Java SE 7).

Документ Charset говорит:

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

Кроме того, я обнаружил «ошибку» об использовании -Dfile.encoding с этой окончательной оценкой:

Это не ошибка.Свойство file.encoding не требуется спецификацией платформы J2SE;это внутренняя деталь реализаций Sun и не должна проверяться или изменяться пользовательским кодом.Он также предназначен только для чтения;технически невозможно поддерживать установку этого свойства в произвольные значения в командной строке или в любое другое время во время выполнения программы.

Предпочтительный способ изменить кодировку по умолчанию, используемую виртуальной машиной и системой времени выполнения, состоит визмените локаль базовой платформы перед запуском вашей Java-программы.

3 голосов
/ 22 января 2012

Charset.defaultCharset() дает кодировку работающей JVM, поэтому она не всегда совпадает со значением. Например, если вы запускаете свои программы с NetBeans, он всегда будет возвращать UTF-8, так как это кодировка по умолчанию для Java-проектов в NetBeans.

У меня есть настройки, аналогичные вашей. Моя Windows - английская (меню, диалоговые окна - английские), и я использую турецкий для не-Unicode-приложений. Когда я запускаю JVM без каких-либо флагов или системных параметров, обе среды выполнения Java 7 и Java 6 выдают «CP1254» при вызове Charset.defaultCharset(). System.getProperty("file.encoding") и кодировка ввода-вывода по умолчанию также совпадают. (Языковой стандарт системы отличается в этих двух версиях Java, однако это другая история.)

Так что, я думаю, ваша проблема в том, как запустить JVM или как JVM решает использовать кодировку по умолчанию, которую он должен использовать. Если вы уверены, что проблема не в первом (вы запускаете JVM без каких-либо параметров кодирования и не пытаетесь изменить кодировку по умолчанию где-либо в вашей программе), тогда JVM неправильно выбирает кодировку по умолчанию и, скорее всего, это ненормальное поведение.

...