Я читаю 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.
Проблема, с которой я столкнулся, заключается в том, что я не понимаю, когда и как 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"));
}
[...]
Код: Выделить всё
Primary name = Orl�ans // NOT GOOD!
Average weight = 3.0137 // But Floats and Integers are parsed just fine.
Но если да, то почему числовые значения анализируются правильно?
И в настоящее время я предполагаю, что qName и localName параметры предоставляются в UTF-16, это правильно?
Я просто в целом запутался/у меня нет правильной мысленной модели того, что SAXParser + DefaultHandler делают с точки зрения кодировки, потому что я не понимаю, как работает большая часть моего кода, если кодировка везде неправильная.
Подробнее здесь: https://stackoverflow.com/questions/797 ... 16-in-java
Мобильная версия