2

Просматривая JCA 1.7 specification я смог найти только в одном из своих примеров на адаптер ресурсов Deployment Descriptor следующее (Глава 13: Сообщение Приток P 13-50): JCA DD example showing UTF-8 encoding Этот пример показывает использование UTF-8 кодирования, однако нет ничего говоря, что это был необязательный выбор для иллюстрации примера или ограничения на кодировку символа файла.Какова должна быть кодировка символов дескриптора развертывания JCA (ra.xml)?

Я спрашиваю это потому, что я пишу программу Java, чтобы прочитать один из этих файлов и FindBugs™ дает мне это сообщение:

DM_DEFAULT_ENCODING: Reliance на кодировку по умолчанию Найдено вызов метода который будет выполнять преобразование байта в строку String (или String by byte), и предположим, что кодировка по умолчанию подходит. Это приведет к изменению поведения приложения . Используйте альтернативный API и явным образом задайте заголовок или объект Charset.

линия 4 в этом фрагменте кода Java, где будет указана кодировка символов:

01. byte[] contents = new byte[1024]; 
02. int bytesRead = 0; 
03. while ((bytesRead = bin.read(contents)) != -1) 
04.  result.append(new String(contents, 0, bytesRead)); 

Итак, можно ли указать ожидаемую кодировку этого файла в этом случае или нет?

+0

UTF-8 хорошо. Можете ли вы показать код, в котором вы получаете предупреждение FindBugs? –

+0

@Thomas Это не о том, что UTF-8 является хорошим или плохим :) Это больше о том, может ли пользователь указать другую кодировку символов или нет. Я привел пример кода для вашего удобства. –

+1

Предупреждение FindBugs должно исчезнуть, если вы используете 'new String (содержимое, 0, bytesRead, StandardCharsets.UTF_8)'. Вы должны указать ту же кодировку в заголовке XML и в коде. Я не знаю ограничения, которое говорит, что вы * должны использовать UTF-8. –

ответ

2

Из того, что я видел, большинство людей используют кодировку UTF-8 для своего ra.xml. Однако нет ограничений на использование другой кодировки. Поэтому, если вы основываете свой синтаксический анализ, чтобы ожидать только UTF-8, результат может быть не таким, как ожидалось.

Таким образом, вам нужно либо рассчитывать на это в своем коде, когда вы читаете это как обычный текст, либо читаете его как XML-файл и сохраняете головную боль. Я не думаю, что разница в производительности будет проблемой, потому что файлы ra.xml обычно не растут до гигабайт. По крайней мере, те, что я видел до сих пор, составляют в среднем несколько мегабайт.

Для проблемы с Findbug вам просто нужно указать кодировку как UTF-8. В противном случае вы будете использовать значение по умолчанию для JVM, которое определяется при запуске виртуальной машины и, как правило, зависит от локали и кодировки базовой операционной системы. Хотя использование по умолчанию здесь не рекомендуется, если это то, что вам нужно, просто укажите использование кодировки по умолчанию. Это избавит вас от проблемы с Findbug.

Так что ваш код будет выглядеть как-то вроде этого:

01. byte[] contents = new byte[1024]; 
02. int bytesRead = 0; 
03. while ((bytesRead = bin.read(contents)) != -1) 
04.  result.append(new String(contents, 0, bytesRead, Charset.defaultCharset())); 
1

FindBugs просто предупреждает вас, что вы полагаетесь на системную кодировку по умолчанию, поэтому вполне возможно, что если ваше приложение будет запущено другим пользователем в другой стране, вы можете получить неожиданные результаты. Лучше явно указать, какую кодировку вы хотите использовать.

В вашем случае фактическая кодировка должна быть извлечена из файла XML. Есть несколько способов получить его. Один из методов заключается в использовании XMLStreamReader, как описано в ответе this.