Почему имена кодировок не являются константами?



проблемы с кодировкой запутаны и сложны сами по себе, но кроме того, вы должны помнить точные имена своих кодировок. Разве это "utf8"? Или "utf-8"? Или, может быть,"UTF-8"? При поиске в интернете образцов кода Вы увидите все вышеперечисленное. Почему бы просто не сделать их именованными константами и использовать Charset.UTF8?

534   6  

6 ответов:

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

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

JDK 1.4 сделал большую вещь, введя тип кодировки. На этом этапе они больше не хотели бы предоставлять строковые константы, так как цель состоит в том, чтобы все использовали экземпляры Charset. Так зачем не предоставить шесть стандартных констант кодировки, то? Я спросил Мартина Бухгольца, так как он сидит прямо рядом со мной, и он сказал, что не было действительно большой причины, за исключением того, что в то время все было еще наполовину испечено-слишком мало API JDK было модернизировано, чтобы принять Charset, и из тех, которые были, перегрузки Charset обычно выполнялись немного хуже.

печально, что только в JDK 1.6 они, наконец, закончили оснащение всего Кодировка перегружается. И что эта обратная ситуация производительности все еще существует (причина, почему это невероятно странно, и я не могу объяснить это, но связано с безопасностью!).

короче говоря - просто определите свои собственные константы или используйте класс Charsets Guava, с которым связан Тони пони (хотя эта библиотека еще не выпущена).

обновление: a StandardCharsets класс находится в JDK 7.

два года спустя, и Java 7-х StandardCharsets теперь определяет константы для 6 стандартных наборов символов.

Если вы застряли на Java 5/6, вы можете использовать Guava Charsets константы, как предположили Кевин Бурриллион и Джон Скит.

Я бы сказал, что мы можем сделать гораздо лучше... почему гарантированные к доступу кодировки не доступны напрямую? Charset.UTF8 должна быть ссылка на Charset, а не имя в виде строки. Таким образом, нам не придется обращаться UnsupportedEncodingException все на месте.

имейте в виду, я также думаю, что .NET выбрал лучшую стратегию, по умолчанию для UTF-8 везде. Затем он облажался, назвав свойство кодировки "операционная система по умолчанию" просто Encoding.Default - что не значение по умолчанию в самой .NET: (

вернемся к разглагольствованию о поддержке кодировки Java - почему нет конструктора для FileWriter/FileReader что происходит Charset? В основном это почти бесполезные классы из - за этого ограничения-вам почти всегда нужен InputStreamReader вокруг a FileInputStreamили эквивалент для вывода :(

медсестра, медсестра - где мое лекарство?

EDIT: мне кажется, что это действительно не ответило на вопрос. Реальный ответ, по-видимому, либо "никто из участников не думал об этом", либо " кто-то из участников думал, что это плохая идея."Я бы настоятельно рекомендовал, чтобы внутренние служебные классы, предоставляющие имена или кодировки, избегали дублирования вокруг кодовой базы... Или вы могли бы просто использовать тот, который мы использовали в Google, когда этот ответ был написан. (Обратите внимание, что с Java 7 вы просто используете StandardCharsets.)

В Java 1.7

import java.nio.charset.StandardCharsets

ex: StandardCharsets.UTF_8 StandardCharsets.US_ASCII

текущее состояние API кодирования оставляет желать лучшего. Некоторые части Java 6 API не принимают Charset в строку (в logging,dom.ls,PrintStream; могут быть и другие). Это не помогает, что кодировки должны иметь разные канонические имена для разных частей стандартной библиотеки.

я могу понять, как все дошло до того, где они находятся; не уверен, что у меня есть блестящие идеи о том, как исправить их.


как в сторону...

вы можете посмотреть имена для реализации Java 6 Sun здесь.

для UTF-8 каноническими значениями являются "UTF-8" на java.nio и "UTF8" на java.lang и java.io. Единственные кодировки, которые спецификация требует поддержки JRE, являются:ASCII США; СТАНДАРТ ISO-8859-1, А UTF-8; КОДИРОВКА UTF-16BE, А UTF-16LE, А UTF-16.

Я давно определил служебный класс с константами кодировки UTF_8, ISO_8859_1 и US_ASCII.

кроме того, некоторое время назад ( 2+ лет ) я сделал простой тест производительности между new String( byte[], Charset ) и new String( byte[], String charset_name ) и обнаружил, что последняя реализация значительно быстрее. Если вы посмотрите под капотом на исходный код, вы увидите, что они действительно следуют по другому пути.

по этой причине я включил в одном классе

public static String stringFromByteArray (
    final byte[] array,
    final Charset charset
)
{
    try
    {
        return new String( array, charset.name( ) )
    }
    catch ( UnsupportedEncodingException ex )
    {
        // cannot happen
    }
}

почему строка (byte[], Charset ) конструктор не делает то же самое, бьет меня.

Comments

    Ничего не найдено.