Класс Charset
- java.lang.Object
-
- java.nio.charset.Charset
- Все реализуемые интерфейсы:
Comparable<Charset>
public abstract class Charset extends Object implements Comparable<Charset>
Именованное отображение последовательностей шестнадцатибитных юникодных единиц кода на последовательности байтов. Этот класс определяет методы для создания декодеров и кодеров, а также для получения различных имён, связанных с набором символов. Экземпляры этого класса неизменяемы.
Этот класс также определяет статические методы для проверки поддержки конкретного набора символов, для поиска экземпляров наборов символов по имени и для построения карты, содержащей каждый набор символов, для которого доступна поддержка в текущей виртуальной машине Java. Поддержка новых наборов символов может быть добавлена с помощью интерфейса поставщика услуг, определённого в классе CharsetProvider.
Все методы, определённые в этом классе, безопасны для использования несколькими конкурирующими потоками.
Имена наборов символов
Наборы символов имеют имена, состоящие из следующих символов:
- Прописные буквы от
'A'до'Z'('\u0041'до'\u005a'), - Строчные буквы от
'a'до'z'('\u0061'до'\u007a'), - Цифры от
'0'до'9'('\u0030'до'\u0039'), - Дефис
'-'('\u002d', ДЕФИС), - Плюс
'+'('\u002b', ПЛЮС), - Точка
'.'('\u002e', ТОЧКА), - Двоеточие
':'('\u003a', ДВОЕТОЧИЕ), и - Подчёркивание
'_'('\u005f', ПОДЧЁРКИВАНИЕ).
Каждый набор символов имеет каноническое имя и может также иметь одно или несколько псевдонимов. Каноническое имя возвращается методом name этого класса. Канонические имена, как правило, обычно записываются прописными буквами. Псевдонимы набора символов возвращаются методом aliases.
Некоторые наборы символов имеют историческое имя, определённое для совместимости с предыдущими версиями платформы Java. Историческое имя набора символов — это либо его каноническое имя, либо один из его псевдонимов. Историческое имя возвращается методами getEncoding() классов InputStreamReader и OutputStreamWriter.
Если набор символов, перечисленный в реестре наборов символов IANA, поддерживается реализацией платформы Java, то его каноническое имя должно совпадать с именем, указанным в реестре. Многие наборы символов имеют более одного имени в реестре, в этом случае реестр определяет одно из имён как предпочитаемое в MIME. Если у набора символов более одного имени в реестре, то его каноническим именем должно быть предпочтительное имя в MIME, а другие имена в реестре должны быть допустимыми псевдонимами. Если поддерживаемый набор символов не указан в реестре IANA, то его каноническое имя должно начинаться с одной из строк "X-" или "x-".
Реестр наборов символов IANA со временем изменяется, поэтому каноническое имя и псевдонимы конкретного набора символов также могут меняться со временем. Для обеспечения совместимости рекомендуется не удалять ни один псевдоним набора символов и, если каноническое имя набора символов изменено, сделать его предыдущее каноническое имя псевдонимом.
Стандартные наборы символов
Каждая реализация платформы Java обязана поддерживать следующие стандартные наборы символов. Обратитесь к документации к релизу вашей реализации, чтобы узнать, поддерживаются ли другие наборы символов. Поведение таких необязательных наборов символов может отличаться в разных реализациях.
| Набор символов | Описание |
|---|---|
US-ASCII | Семибитный ASCII, также известный как ISO646-US, также известный как блок «Основной латинский» набора символов Unicode |
ISO-8859-1 | ISO Латинский алфавит № 1, также известный как ISO-LATIN-1
|
UTF-8 | Восьмибитный формат преобразования UCS |
UTF-16BE | Шестнадцатибитный формат преобразования UCS, порядок байтов — big-endian |
UTF-16LE | Шестнадцатибитный формат преобразования UCS, порядок байтов — little-endian |
UTF-16 | Шестнадцатибитный формат преобразования UCS, порядок байтов определяется необязательной меткой порядка байтов |
Набор символов UTF-8 определяется в RFC 2279; формат преобразования, на котором он основан, указан в поправке 2 к ISO 10646-1 и также описан в стандарте Unicode.
Наборы символов UTF-16 определены в RFC 2781; форматы преобразования, на которых они основаны, определены в поправке 1 к ISO 10646-1 и также описаны в стандарте Unicode.
Наборы символов UTF-16 используют шестнадцатибитные значения и поэтому чувствительны к порядку байтов. В этих кодировках порядок байтов потока может быть указан начальной меткой порядка байтов, представленной символом Unicode '\uFEFF'. Метки порядка байтов обрабатываются следующим образом:
При декодировании наборы символов
UTF-16BEиUTF-16LEинтерпретируют начальные метки порядка байтов как ПРОБЕЛ БЕЗ ШИРИНЫ И НЕРАЗРЫВНЫЙ; при кодировании они не записывают метки порядка байтов.При декодировании набор символов
UTF-16интерпретирует метку порядка байтов в начале входного потока для указания порядка байтов потока, но по умолчанию использует big-endian, если метка порядка байтов отсутствует; при кодировании он использует big-endian порядок байтов и записывает метку порядка байтов big-endian.
Каждая виртуальная машина Java имеет набор символов по умолчанию, который может быть или не быть одним из стандартных наборов символов. Набор символов по умолчанию определяется во время запуска виртуальной машины и, как правило, зависит от локали и набора символов, используемых основной операционной системой.
Класс StandardCharsets определяет константы для каждого из стандартных наборов символов.
Терминология
Название этого класса заимствовано из терминов, используемых в RFC 2278. В этом документе набор символов определяется как сочетание одного или нескольких кодированных наборов символов и схемы кодирования символов. (Это определение запутанное; некоторые другие программные системы определяют набор символов как синоним кодированного набора символов.)
Кодированный набор символов — это отображение между набором абстрактных символов и набором целых чисел. US-ASCII, ISO 8859-1, JIS X 0201 и Unicode являются примерами кодированных наборов символов.
Некоторые стандарты определили набор символов как просто набор абстрактных символов без присвоенного им номера. Алфавит является примером такого набора символов. Однако тонкое различие между набором символов и кодированным набором символов редко используется на практике; первое стало кратким обозначением второго, включая в спецификации API Java.
Схема кодирования символов — это отображение между одним или несколькими кодированными наборами символов и набором последовательностей октетов (восьмибитных байтов). UTF-8, UTF-16, ISO 2022 и EUC являются примерами схем кодирования символов. Схемы кодирования часто ассоциируются с конкретным кодированным набором символов; UTF-8, например, используется только для кодирования Unicode. Однако некоторые схемы ассоциируются с несколькими кодированными наборами символов; EUC, например, может использоваться для кодирования символов в различных азиатских кодированных наборах символов.
Когда кодированный набор символов используется исключительно с одной схемой кодирования символов, соответствующий набор символов обычно называется по имени кодированного набора символов; в противном случае набор символов обычно называется по имени схемы кодирования и, возможно, по локали кодированных наборов символов, которые он поддерживает. Таким образом, US-ASCII является как названием кодированного набора символов, так и набора символов, который его кодирует, в то время как EUC-JP — это название набора символов, который кодирует кодированные наборы символов JIS X 0201, JIS X 0208 и JIS X 0212 для японского языка.
Внутренняя кодировка символов языка программирования Java — UTF-16. Таким образом, набор символов в платформе Java определяет отображение между последовательностями шестнадцатибитных единиц кода UTF-16 (то есть последовательностями символов) и последовательностями байтов.
- С:
- 1.4
- См. также:
-
CharsetDecoder,CharsetEncoder,CharsetProvider,Character
Конструкторы
| Модификатор | Конструктор | Описание |
|---|---|---|
protected | Charset(String canonicalName,
String[] aliases) | Инициализирует новый набор символов с заданным каноническим именем и набором псевдонимов. |
Методы
| Модификатор и тип | Метод | Описание |
|---|---|---|
Set<String> | aliases() | Возвращает множество, содержащее псевдонимы этого набора символов. |
static SortedMap<String,Charset> | availableCharsets() | Создаёт отсортированную карту из канонических имён наборов символов к объектам наборов символов. |
boolean | canEncode() | Указывает, поддерживает ли этот набор символов кодирование. |
int | compareTo(Charset that) | Сравнивает этот набор символов с другим. |
abstract boolean | contains(Charset cs) | Указывает, содержит ли этот набор символов заданный набор символов. |
CharBuffer | decode(ByteBuffer bb) | Удобный метод, который декодирует байты в этом наборе символов в символы Юникода. |
static Charset | defaultCharset() | Возвращает набор символов по умолчанию этой виртуальной машины Java. |
String | displayName() | Возвращает удобочитаемое имя этого набора символов для локали по умолчанию. |
String | displayName(Locale locale) | Возвращает удобочитаемое имя этого набора символов для заданной локали. |
ByteBuffer | encode(String str) | Удобный метод, который кодирует строку в байты в этом наборе символов. |
ByteBuffer | encode(CharBuffer cb) | Удобный метод, который кодирует символы Юникода в байты в этом наборе символов. |
boolean | equals(Object ob) | Указывает, равен ли этот объект другому. |
static Charset | forName(String charsetName) | Возвращает объект набора символов для указанного набора символов. |
int | hashCode() | Вычисляет хеш-код для этого набора символов. |
boolean | isRegistered() | Указывает, зарегистрирован ли этот набор символов в реестре наборов символов IANA. |
static boolean | isSupported(String charsetName) | Указывает, поддерживается ли указанный набор символов. |
String | name() | Возвращает каноническое имя этого набора символов. |
abstract CharsetDecoder | newDecoder() | Создаёт новый декодер для этого набора символов. |
abstract CharsetEncoder | newEncoder() | Создаёт новый кодировщик для этого набора символов. |
String | toString() | Возвращает строку, описывающую этот набор символов. |
Методы, объявленные в классе java.lang.Object
clone, finalize, getClass, notify, notifyAll, wait, wait, wait Конструкторы
Charset
protected Charset(String canonicalName,
String[] aliases) Инициализирует новый набор символов с заданным каноническим именем и множеством псевдонимов.
- Параметры:
-
canonicalName- Каноническое имя этого набора символов -
aliases- Массив псевдонимов этого набора символов или null, если псевдонимов нет - Исключения:
-
IllegalCharsetNameException- Если каноническое имя или любой из псевдонимов некорректны
Методы
isSupported
public static boolean isSupported(String charsetName)
Указывает, поддерживается ли заданный кодировочный стандарт.
- Параметры:
-
charsetName- Название запрошенного кодировочного стандарта; может быть как каноническим именем, так и псевдонимом - Возвращает:
-
trueесли и только если поддержка заданного кодировочного стандарта доступна в текущей виртуальной машине Java - Исключение:
-
IllegalCharsetNameException- Если заданное имя кодировочного стандарта является недопустимым -
IllegalArgumentException- Если заданноеcharsetNameимеет значение null
forName
public static Charset forName(String charsetName)
Возвращает объект кодировочного стандарта для заданного имени кодировочного стандарта.
- Параметры:
-
charsetName- Название запрошенного кодировочного стандарта; может быть как каноническим именем, так и псевдонимом - Возвращает:
- Объект кодировочного стандарта для заданного имени кодировочного стандарта
- Исключение:
-
IllegalCharsetNameException- Если заданное имя кодировочного стандарта является недопустимым -
IllegalArgumentException- Если заданноеcharsetNameимеет значение null -
UnsupportedCharsetException- Если поддержка заданного кодировочного стандарта недоступна в текущей виртуальной машине Java
availableCharsets
public static SortedMap<String,Charset> availableCharsets()
Создает отсортированную карту от канонических имён кодировочных стандартов к объектам кодировочных стандартов.
Возвращаемая картой метод содержит одну запись для каждого кодировочного стандарта, для которого доступна поддержка в текущей виртуальной машине Java. Если два или более поддерживаемых кодировочных стандарта имеют одинаковое каноническое имя, возвращаемая карта будет содержать только один из них; какой именно — не определено.
Вызов этого метода и последующее использование возвращаемой карты могут привести к длительным операциям ввода-вывода на диске или в сети. Этот метод предназначен для приложений, которым нужно перечислить все доступные кодировочные стандарты, например, для предоставления пользователю возможности выбора кодировки. Этот метод не используется методом forName, который вместо этого использует эффективный инкрементальный алгоритм поиска.
Этот метод может возвращать разные результаты в разное время, если к текущей виртуальной машине Java динамически добавляются новые поставщики кодировочных стандартов. При отсутствии таких изменений кодировочные стандарты, возвращаемые этим методом, — это те же самые кодировочные стандарты, которые можно получить с помощью метода forName.
- Возвращает:
- Неизменяемую карту без учета регистра от канонических имён кодировочных стандартов к объектам кодировочных стандартов
defaultCharset
public static Charset defaultCharset()
Возвращает кодировку по умолчанию для данной виртуальной машины Java.
Кодировка по умолчанию определяется во время запуска виртуальной машины и обычно зависит от локали и кодировки базовой операционной системы.
- Возвращает:
- Объект кодировочного стандарта для кодировки по умолчанию
- С:
- 1.5
name
public final String name()
Возвращает каноническое имя этого кодировочного стандарта.
- Возвращает:
- Каноническое имя этого кодировочного стандарта
aliases
public final Set<String> aliases()
Возвращает множество, содержащее псевдонимы этого кодировочного стандарта.
- Возвращает:
- Неизменяемое множество псевдонимов этого кодировочного стандарта
displayName
public String displayName()
Возвращает удобочитаемое имя этого кодировочного стандарта для локали по умолчанию.
По умолчанию этот метод просто возвращает каноническое имя этого кодировочного стандарта. Конкретные подклассы этого класса могут переопределять этот метод, чтобы предоставить локализованное имя для отображения.
- Возвращает:
- Имя для отображения этого кодировочного стандарта в локали по умолчанию
isRegistered
public final boolean isRegistered()
Указывает, зарегистрирован ли данный кодировочный стандарт в реестре кодировок IANA.
- Возвращает:
-
trueесли и только если этот кодировочный стандарт известен своему реализатору как зарегистрированный в IANA
displayName
public String displayName(Locale locale)
Возвращает удобочитаемое имя этого кодировочного стандарта для заданной локали.
По умолчанию этот метод просто возвращает каноническое имя этого кодировочного стандарта. Конкретные подклассы этого класса могут переопределять этот метод, чтобы предоставить локализованное имя для отображения.
- Параметры:
-
locale- Локаль, для которой нужно получить имя для отображения - Возвращает:
- Имя для отображения этого кодировочного стандарта в заданной локали
contains
public abstract boolean contains(Charset cs)
Указывает, содержит ли данный кодировочный стандарт заданный кодировочный стандарт.
Кодировочный стандарт C считается содержащим кодировочный стандарт D, если и только если каждый символ, представимый в D, также представим в C. Если это отношение выполняется, гарантируется, что любая строка, которая может быть закодирована в D, также может быть закодирована в C без выполнения каких-либо замен.
То, что C содержит D, не означает, что каждый символ, представимый в C определённой последовательностью байтов, представлен в D той же последовательностью байтов, хотя иногда это бывает так.
Каждый кодировочный стандарт содержит себя.
Этот метод вычисляет приближение отношения включения: если он возвращает true, то заданный кодировочный стандарт, как известно, содержится в этом кодировочном стандарте; если он возвращает false, то это не обязательно означает, что заданный кодировочный стандарт не содержится в этом кодировочном стандарте.
- Параметры:
-
cs- Заданный кодировочный стандарт - Возвращает:
-
trueесли заданный кодировочный стандарт содержится в этом кодировочном стандарте
newDecoder
public abstract CharsetDecoder newDecoder()
Создаёт новый декодер для данного кодировочного стандарта.
- Возвращает:
- Новый декодер для данного кодировочного стандарта
newEncoder
public abstract CharsetEncoder newEncoder()
Создаёт новый кодировщик для данного кодировочного стандарта.
- Возвращает:
- Новый кодировщик для данного кодировочного стандарта
- Исключение:
-
UnsupportedOperationException- Если этот кодировочный стандарт не поддерживает кодирование
canEncode
public boolean canEncode()
Указывает, поддерживает ли этот кодировочный стандарт кодирование.
Почти все кодировочные стандарты поддерживают кодирование. Основные исключения — специальные кодировочные стандарты «автоопределения», декодеры которых могут определить, какая из нескольких возможных схем кодирования используется, анализируя последовательность входных байтов. Такие кодировочные стандарты не поддерживают кодирование, поскольку нет способа определить, какая кодировка должна быть использована на выходе. Реализации таких кодировочных стандартов должны переопределять этот метод, чтобы возвращать false.
- Возвращает:
-
trueесли и только если этот кодировочный стандарт поддерживает кодирование
decode
public final CharBuffer decode(ByteBuffer bb)
Метод удобства, который декодирует байты в этом кодировочном стандарте в символы Юникода.
Вызов этого метода для кодировочного стандарта cs возвращает тот же результат, что и выражение
cs.newDecoder()
.onMalformedInput(CodingErrorAction.REPLACE)
.onUnmappableCharacter(CodingErrorAction.REPLACE)
.decode(bb); за исключением того, что он потенциально более эффективен, так как может кэшировать декодеры между последовательными вызовами. Этот метод всегда заменяет последовательности неверного ввода и неотображаемых символов по умолчанию для этого кодировочного стандарта. Для обнаружения таких последовательностей используйте метод CharsetDecoder.decode(java.nio.ByteBuffer) напрямую.
- Параметры:
-
bb- Буфер байтов, подлежащий декодированию - Возвращает:
- Буфер символов, содержащий декодированные символы
encode
public final ByteBuffer encode(CharBuffer cb)
Метод удобства, который кодирует символы Юникода в байты в этом кодировочном стандарте.
Вызов этого метода для кодировочного стандарта cs возвращает тот же результат, что и выражение
cs.newEncoder()
.onMalformedInput(CodingErrorAction.REPLACE)
.onUnmappableCharacter(CodingErrorAction.REPLACE)
.encode(bb); за исключением того, что он потенциально более эффективен, так как может кэшировать кодировщики между последовательными вызовами. Этот метод всегда заменяет последовательности неверного ввода и неотображаемых символов по умолчанию для этого кодировочного стандарта. Для обнаружения таких последовательностей используйте метод CharsetEncoder.encode(java.nio.CharBuffer) напрямую.
- Параметры:
-
cb- Буфер символов, подлежащий кодированию - Возвращает:
- Буфер байтов, содержащий закодированные символы
encode
public final ByteBuffer encode(String str)
Метод удобства, который кодирует строку в байты в данном кодировочном стандарте.
Вызов этого метода для кодировочного стандарта cs возвращает тот же результат, что и выражение
cs.encode(CharBuffer.wrap(s));
- Параметры:
-
str- Строка, подлежащая кодированию - Возвращает:
- Буфер байтов, содержащий закодированные символы
compareTo
public final int compareTo(Charset that)
Сравнивает данный кодировочный стандарт с другим кодировочным стандартом.
Кодировочные стандарты упорядочены по их каноническим именам без учёта регистра.
- Указано в:
-
compareToв интерфейсеComparable<Charset> - Параметры:
-
that- Кодировочный стандарт, с которым сравнивается данный кодировочный стандарт - Возвращает:
- Отрицательное целое число, ноль или положительное целое число, если этот кодировочный стандарт меньше, равен или больше, чем указанный кодировочный стандарт
hashCode
public final int hashCode()
Вычисляет хеш-код для данного кодировочного стандарта.
- Переопределяет:
-
hashCodeв классеObject - Возвращает:
- Целое число хеш-кода
- См. также:
-
Object.equals(java.lang.Object),System.identityHashCode(java.lang.Object)
equals
public final boolean equals(Object ob)
Определяет, равен ли данный объект другому объекту.
Два кодировочных стандарта равны, если и только если они имеют одинаковые канонические имена. Кодировочный стандарт никогда не равен любому другому типу объекта.
- Переопределяет:
-
equalsв классеObject - Параметры:
-
ob- Ссылаемый объект, с которым сравнивается данный объект. - Возвращает:
-
trueесли и только если этот кодировочный стандарт равен заданному объекту - См. также:
-
Object.hashCode(),HashMap
toString
public final String toString()
Возвращает строку, описывающую данный кодировочный стандарт.
© 1993, 2020, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/nio/charset/Charset.html