Анализ XML UTF-8 с использованием DefaultHandler: когда и как он становится UTF-16 в Java?JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Анализ XML UTF-8 с использованием DefaultHandler: когда и как он становится UTF-16 в Java?

Сообщение Anonymous »

У меня есть программа на Java, которая отлично работала в Corretto 17, но теперь имеет проблемы с кодировкой набора символов в Corretto 25.
Я читаю XML в кодировке UTF-8 из внешнего API. Код довольно прост: я формирую HTTPUrlConnection и у меня есть класс, расширяющий DefaultHandler:

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

URI uri = new URI(url);
URL authenticatedURL = uri.toURL();
HttpURLConnection connection = (HttpURLConnection) authenticatedURL.openConnection();
connection.setRequestMethod("GET");
connection.setRequestProperty("Authorization", "Bearer " + BEARER_TOKEN);
// connection.setRequestProperty("Accept-Charset", "UTF-8");  // This line of code seems to have no impact.
[...]
InputStream connectionInputStream = connection.getInputStream();
InputSource connectionInputSource = new InputSource(connectionInputStream);
connectionInputSource.setEncoding(StandardCharsets.UTF_8.displayName());
parser.parse(connectionInputSource, dh);
// parser.parse(connection.getInputStream(), dh);  // This 1 line seems to work the same as the above 4 lines.
Насколько я понимаю, Java использует UTF-16 для всех строк, но также предполагает, что некоторые входные данные (например, XML) будут в UTF-8, например класс Attributes, используемый DefaultHandler. Я предполагаю, что это предположение UTF-8 является причиной того, что явная установка кодировки/кодировки в приведенном выше коде не имеет никакого значения. Это правильно?
Проблема, с которой я столкнулся, заключается в том, что я не понимаю, когда и как UTF-8, который я читаю, преобразуется в UTF-16. Например, в моем расширении DefaultHandler атрибуты.getValue(), похоже, возвращают строку в кодировке UTF-8, но Float.parseFloat() работает отлично:

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

public void startElement(String uri, String localName, String qName, Attributes attributes) {
if ("name".equals(qName)) {
if ("primary".equals(attributes.getValue("type"))) {
if (attributeHasValue(attributes, "value")) {
primaryName = attributes.getValue("value");  // Seems to store UTF-8 string.
}
}
} else if ("averageweight".equals(qName)) {
if (attributeHasValue(attributes, "value")) {
averageWeight = Float.parseFloat(attributes.getValue("value"));
}
[...]
Выходные данные (когда я печатаю значения в System.out.println):

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

Primary name = Orl�ans   // NOT GOOD!
Average weight = 3.0137  // But Floats and Integers are parsed just fine.
Полагаю, мне нужно явно преобразовать значение, возвращаемое атрибутами.getValue(), из UTF-8 в UTF-16, это правильно?
Но если да, то почему числовые значения анализируются правильно?
И в настоящее время я предполагаю, что qName и localName параметры предоставляются в UTF-16, это правильно?
Я просто в целом запутался/у меня нет правильной мысленной модели того, что SAXParser + DefaultHandler делают с точки зрения кодировки, потому что я не понимаю, как работает большая часть моего кода, если кодировка везде неправильная.

Подробнее здесь: https://stackoverflow.com/questions/797 ... 16-in-java
Ответить

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

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

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

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

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