Является ли шестнадцатеричный код с непечатаемым символом символом двойной кодировки?JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Является ли шестнадцатеричный код с непечатаемым символом символом двойной кодировки?

Сообщение Anonymous »

У нас есть веб-приложение, которое интегрируется со сторонней службой, где служба отправляет ответ после получения запроса, созданного из нашего приложения. В настоящее время мы устраняем проблему, из-за которой ответ службы возвращает специальные символы или символы с диакритическими знаками (например, символы с латинским акцентом) в качестве закодированного артефакта в наших журналах Wildfly, а также мы видим дополнительный непечатаемый символ, добавленный в конец ('?'), что приводит к неправильному подсчету длины строки для нашего класса чтения.
Например, строка "PARAŇAQUE" в качестве предполагаемой строки веб-приложение регистрирует ответ этой строки с помощью Ň показано на следующем изображении ниже:
Изображение

Примечание. Мы пытались воспроизвести этот артефакт кодирования напрямую с помощью онлайн-инструментов, но не смогли воспроизвести его локально, поскольку это было обнаружено в нашей тестовой среде UAT, которая расположена в другой сети. Мы попытались экспортировать и перенести файл на наш локальный компьютер, но отображаемый символ при открытии отличается.
Я связался со сторонним поставщиком услуг, и они подтвердили, что возвращают значение как PARAŇAQUE в своем файле ответов.
Первый вопрос: правильно ли, что это также считается проблемой двойного кодирования между наборами символов кодировки ISO-8859-1 и UTF-8?
Мы мы также рассматриваем различные методы решения этой проблемы, но, чтобы сделать ее универсальной и ориентированной на производительность, мы рассматриваем следующие два метода исправления:

Код: Выделить всё

private String fixResponseEncoding(String responseString) {
try {
// Try the most common fix: ISO-8859-1 → UTF-8
String fixed = new String(responseString.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);

// Only use the fix if it reduces encoding artifacts
if (countEncodingArtifacts(fixed) < countEncodingArtifacts(responseString)) {
LOGGER.info("Applied double-encoding fix (ISO-8859-1 → UTF-8)");
return fixed;
}

// If no improvement, return original
return responseString;

} catch (Exception e) {
LOGGER.warn("Encoding fix failed: {}", e.getMessage());
return responseString;
}
}

private int countEncodingArtifacts(String text) {
int count = 0;

// Count common double-encoding patterns (Ã followed by high bytes)
for (int i = 0; i < text.length() - 1; i++) {
char c1 = text.charAt(i);
char c2 = text.charAt(i + 1);

// Ã (0xC3) followed by 0x80-0xBF range
if (c1 == 'Ã' && c2 >= 0x80 && c2 = 0x80 && c2 

Подробнее здесь: [url]https://stackoverflow.com/questions/79816883/is-a-hex-code-with-a-non-printable-character-is-a-double-encoded-character[/url]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»