В Java для декодирования строки чаще всего используют классы java.net.URLDecoder, Base64 и CharsetDecoder. Каждый из них подходит для разных типов кодирования: URL, Base64 и различных наборов символов соответственно.
Метод URLDecoder.decode(String s, String encoding) позволяет превратить строку с URL-кодированием (например, "%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80"
) обратно в читаемый текст. Важно явно указывать кодировку, предпочтительно «UTF-8», чтобы избежать потерь при преобразовании символов.
Для декодирования Base64 используется класс java.util.Base64. Метод Base64.getDecoder().decode(String src) возвращает массив байтов, который можно превратить в строку, указав нужную кодировку: new String(decodedBytes, StandardCharsets.UTF_8). Этот подход подходит для обработки токенов, изображений, двоичных данных, переданных в текстовом виде.
Если требуется декодировать строку, закодированную в другом наборе символов, используется CharsetDecoder из пакета java.nio.charset. Такой подход нужен при чтении данных из внешних источников, где явно не задана кодировка. Пример: Charset.forName(«Windows-1251»).newDecoder().decode(ByteBuffer.wrap(bytes)).
При выборе метода декодирования нужно учитывать, каким образом была закодирована строка. Универсального способа нет: попытка декодировать Base64 через URLDecoder приведёт к ошибке, а попытка интерпретировать байты в неправильной кодировке даст искажённый результат.
Как декодировать строку из формата Base64 с помощью java.util.Base64
Для декодирования строки из формата Base64 в Java используется класс java.util.Base64
, доступный начиная с Java 8. Метод Base64.getDecoder().decode(String src)
преобразует строку в массив байтов.
Пример:
import java.util.Base64;
public class Base64DecoderExample {
public static void main(String[] args) {
String encoded = "0J/RgNC40LLQtdGC";
byte[] decodedBytes = Base64.getDecoder().decode(encoded);
String decoded = new String(decodedBytes);
}
}
Метод decode
выбрасывает IllegalArgumentException
, если входная строка содержит недопустимые символы или нарушает спецификацию Base64. Для проверки корректности данных желательно использовать блок try-catch
.
Если данные считываются из потока, используйте Base64.Decoder.wrap(InputStream)
, который возвращает InputStream
с автоматическим декодированием.
Пример декодирования из потока:
import java.util.Base64;
import java.io.*;
public class Base64StreamDecoder {
public static void main(String[] args) throws IOException {
String encoded = "0J/RgNC40LLQtdGC";
InputStream input = new ByteArrayInputStream(encoded.getBytes());
InputStream decodedStream = Base64.getDecoder().wrap(input);
ByteArrayOutputStream output = new ByteArrayOutputStream();
int b;
while ((b = decodedStream.read()) != -1) {
output.write(b);
}
String decoded = output.toString("UTF-8");
}
}
Для безопасности убедитесь, что входные данные не получены из ненадежных источников без предварительной валидации. Base64 не обеспечивает шифрование – только представление данных в безопасной для передачи форме.
Декодирование URL-закодированной строки через java.net.URLDecoder
Класс java.net.URLDecoder
позволяет преобразовать строку, закодированную в формате application/x-www-form-urlencoded
, обратно в обычный вид. Метод decode(String s, String encoding)
требуется использовать с явным указанием кодировки, например "UTF-8"
. Пример: URLDecoder.decode("param%3Dvalue%26id%3D123", "UTF-8")
вернёт param=value&id=123
.
При использовании недопустимой или неподдерживаемой кодировки будет выброшено UnsupportedEncodingException
, поэтому рекомендуется либо перехватывать исключение, либо использовать API из Java 10 и новее, где доступен метод decode(String s, Charset charset)
, не выбрасывающий проверяемые исключения.
Замену плюсов на пробелы ('+'
→ ' '
) URLDecoder
выполняет автоматически, поскольку это поведение формата application/x-www-form-urlencoded
, но оно не подходит для декодирования произвольных URL. Для таких случаев следует использовать java.net.URI
или java.net.URL
.
Для безопасной работы с пользовательским вводом необходимо валидировать данные до декодирования, чтобы избежать двойного декодирования и связанных с этим уязвимостей.
Преобразование строк из формата Unicode (например, \u041F\u0440\u0438\u0432\u0435\u0442)
Строки, содержащие символы в формате \uXXXX
, не преобразуются автоматически в читаемый текст. Чтобы получить исходные символы, требуется ручная декодировка.
Для преобразования строки с Unicode-последовательностями можно использовать стандартные средства Java:
- Метод через
Properties
: работает, так какProperties.load
автоматически интерпретирует Unicode-экранирование.
import java.io.StringReader;
import java.util.Properties;
public class UnicodeDecoder {
public static String decodeUnicode(String unicodeStr) throws Exception {
Properties props = new Properties();
props.load(new StringReader("key=" + unicodeStr));
return props.getProperty("key");
}
}
- Входная строка должна быть валидной, иначе произойдёт ошибка чтения.
- Метод не подходит для декодирования в потоках или больших данных.
- Метод с регулярным выражением и ручной заменой: полезен при обработке отдельных участков текста.
public class UnicodeDecoder {
public static String decodeUnicode(String input) {
StringBuilder result = new StringBuilder();
int i = 0;
while (i < input.length()) {
if (input.charAt(i) == '\\' && i + 5 < input.length() && input.charAt(i + 1) == 'u') {
String hex = input.substring(i + 2, i + 6);
int code = Integer.parseInt(hex, 16);
result.append((char) code);
i += 6;
} else {
result.append(input.charAt(i));
i++;
}
}
return result.toString();
}
}
- Подходит для строк с произвольной структурой.
- Позволяет интеграцию в потоки преобразования без использования дополнительных библиотек.
В обоих случаях необходимо убедиться, что входная строка корректно экранирована и не содержит недопустимых последовательностей.
Как декодировать HTML-сущности в Java
Для декодирования HTML-сущностей в Java можно использовать готовые библиотеки, которые корректно преобразуют такие строки, как <
или
, в соответствующие символы. Один из наиболее надёжных вариантов – Apache Commons Text.
Для использования Apache Commons Text необходимо добавить зависимость:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-text</artifactId>
<version>1.10.0</version>
</dependency>
Затем можно использовать метод StringEscapeUtils.unescapeHtml4
:
import org.apache.commons.text.StringEscapeUtils;
String input = "<div>Текст</div>";
String decoded = StringEscapeUtils.unescapeHtml4(input);
// decoded: "Текст"
Если использование сторонних библиотек недопустимо, можно воспользоваться встроенными средствами. Например, через HtmlUtils
из Spring Framework:
import org.springframework.web.util.HtmlUtils;
String decoded = HtmlUtils.htmlUnescape("© 2025");
// decoded: "© 2025"
При отсутствии внешних зависимостей и невозможности использовать сторонние библиотеки остаётся ручная замена наиболее распространённых сущностей:
String input = "<div>";
String decoded = input.replace("<", "<")
.replace(">", ">")
.replace("&", "&")
.replace(""", "\"")
.replace("'", "'");
// decoded: ""
Этот способ подходит только для ограниченного набора символов и не поддерживает числовые или редкие именованные сущности. Для полной поддержки стандарта рекомендуется использовать Apache Commons Text.
Работа с декодированием строки в кодировке ISO-8859-1
Кодировка ISO-8859-1 (Latin-1) охватывает 256 символов, включая основные символы латиницы и некоторые знаки для западноевропейских языков. В Java строка в этой кодировке может быть декодирована с помощью класса String и метода getBytes.
Если исходная строка была закодирована в ISO-8859-1, необходимо использовать следующий подход:
byte[] bytes = encodedString.getBytes(StandardCharsets.ISO_8859_1);
String decoded = new String(bytes, StandardCharsets.ISO_8859_1);
Этот способ полезен, когда данные поступают от систем, использующих ISO-8859-1, например, старых HTTP-серверов или внешних API. Важно избегать преобразования через new String(byte[]) без указания кодировки – в этом случае будет применена платформа по умолчанию, что приведёт к искажению данных.
Для получения массива байт из строки, закодированной в ISO-8859-1, предпочтительно использовать:
byte[] data = originalString.getBytes(StandardCharsets.ISO_8859_1);
Если необходимо декодировать строку, полученную из запроса или файла, содержащую символы с кодами 128–255, следует проверять, что они корректно интерпретируются. Например, символ ‘é’ (код 233) должен остаться неизменным после преобразования туда и обратно.
Также допустимо использовать Charset.forName(«ISO-8859-1»), но StandardCharsets.ISO_8859_1 предпочтительнее из-за отсутствия необходимости обработки исключений:
Charset latin1 = StandardCharsets.ISO_8859_1;
String decoded = new String(byteArray, latin1);
Работая с ISO-8859-1, необходимо учитывать невозможность представления кириллических и азиатских символов – при необходимости использовать UTF-8 или подходящую локализованную кодировку (например, Windows-1251).
Декодирование строки из массива байтов с указанием Charset
Для преобразования массива байтов в строку с учётом определённого Charset в Java используется метод String(byte[] bytes, Charset charset)
. Этот подход позволяет точно интерпретировать данные, закодированные в различных кодировках, и избежать ошибок, связанных с неверным преобразованием байтов в символы.
Вот пример декодирования строки из массива байтов с указанием Charset:
import java.nio.charset.Charset;
public class Main {
public static void main(String[] args) {
byte[] bytes = {104, 101, 108, 108, 111}; // "hello" в кодировке UTF-8
String decodedString = new String(bytes, Charset.forName("UTF-8"));
System.out.println(decodedString); // Выведет "hello"
}
}
В этом примере создаётся строка из массива байтов с использованием кодировки UTF-8. Указание конкретной кодировки важно для правильного отображения символов, особенно если данные были получены в другой кодировке.
- Charset.forName(«UTF-8») — создает объект Charset для кодировки UTF-8. Это может быть полезно для гарантированного правильного декодирования строки, независимо от локальной кодировки системы.
- Charset.defaultCharset() — возвращает кодировку по умолчанию, которая зависит от операционной системы. При использовании этого метода могут возникать проблемы с интерпретацией символов, если кодировка данных отличается от системной.
Для эффективного использования декодирования необходимо учитывать несколько моментов:
- Выбор кодировки: Неправильный выбор кодировки может привести к появлению нечитабельных символов. Например, если строка была закодирована в UTF-16, а попытаться декодировать её как UTF-8, результаты будут неверными.
- Производительность: Хотя использование специфичных кодировок может быть медленнее, чем использование кодировки по умолчанию, в большинстве случаев это не имеет значительного влияния на производительность. Однако при работе с большими объёмами данных выбор правильной кодировки имеет важное значение.
- Международная совместимость: Для работы с международными текстами рекомендуется использовать UTF-8, так как она поддерживает большинство символов и является стандартом для многих веб-приложений и протоколов.
Обработка строк с escape-последовательностями JSON
Основные escape-последовательности в JSON:
\"
– двойная кавычка, используемая для обозначения конца или начала строки;
\\
– обратный слэш;
\b
– символ backspace;
\f
– символ form feed;
\n
– символ новой строки;
\r
– символ возврата каретки;
\t
– символ табуляции;
\uXXXX
– символ в Unicode, где XXXX – это четырехзначный код символа в шестнадцатеричной системе.
В Java для декодирования JSON-строки с такими символами часто используется метод java.net.URLDecoder.decode() или библиотеки, такие как Jackson и Gson. Эти библиотеки автоматически обрабатывают escape-последовательности, преобразуя их в соответствующие символы.
Пример обработки строки с escape-последовательностями с помощью библиотеки Jackson:
ObjectMapper objectMapper = new ObjectMapper();
String json = "\"Hello\\nWorld!\"";
String decodedString = objectMapper.readValue(json, String.class);
System.out.println(decodedString); // Выведет: Hello
// World!
При декодировании JSON в строку следует помнить о возможных ошибках при неправильном экранировании. Например, если строка содержит необработанные escape-последовательности, это приведет к исключению. Поэтому важно использовать готовые решения для работы с JSON в Java, чтобы избежать вручную обработанных ошибок.
Для корректной работы с JSON важно обеспечить правильное использование escape-последовательностей, особенно при манипуляции строками, которые будут передаваться через различные системы или храниться в файлах. Несоблюдение этих стандартов может привести к неправильной интерпретации данных, что критично при обмене информацией между сервисами.
Как декодировать строку, закодированную через Apache Commons Codec

Для декодирования строки, закодированной с использованием библиотеки Apache Commons Codec, необходимо использовать соответствующие классы и методы, предоставляемые этой библиотекой. Рассмотрим процесс на примере декодирования строки, закодированной в форматах Base64 и URL-encoded.
1. Декодирование Base64
Для декодирования строки, закодированной в Base64, используется класс Base64
из пакета org.apache.commons.codec.binary
. Этот класс предоставляет метод decodeBase64
, который принимает массив байтов и возвращает декодированную строку.
import org.apache.commons.codec.binary.Base64;
public class DecodeExample {
public static void main(String[] args) {
String encoded = "U29tZSBzdHJpbmc="; // Пример строки в Base64
byte[] decodedBytes = Base64.decodeBase64(encoded);
String decodedString = new String(decodedBytes);
System.out.println(decodedString);
}
}
В данном примере строка «U29tZSBzdHJpbmc=» декодируется в «Some string».
2. Декодирование URL-encoded строки
Если строка была закодирована в формате URL-encoded, для её декодирования используется класс URLCodec
из того же пакета org.apache.commons.codec.net
. Метод decode
принимает строку и возвращает её декодированное значение.
import org.apache.commons.codec.net.URLCodec;
public class DecodeExample {
public static void main(String[] args) throws Exception {
String encoded = "Some%20string%20encoded"; // Пример строки в URL-encoded
URLCodec codec = new URLCodec();
String decodedString = codec.decode(encoded);
System.out.println(decodedString);
}
}
Строка «Some%20string%20encoded» будет декодирована в «Some string encoded».
Для каждого типа кодирования существуют свои методы, и важно правильно выбрать класс в зависимости от формата исходных данных. Apache Commons Codec предоставляет гибкие инструменты для работы с различными форматами кодирования, обеспечивая удобство и безопасность при декодировании строк.
Вопрос-ответ: