Приложение Java для ПК - экспортированный JAR ведет себя не так, как при разработке

У меня есть классическое Java-приложение для ПК. Результатом сборки является файл JAR, который работает на компьютере с Windows.

Приложение читает некоторые XML-файлы и в результате создает HTML-документ. Файл Xml содержит определенные языковые символы, которые не являются родными для английского языка.

Во время разработки в среде IDE (Apache NetBeans 13) сборка -> запуск экспортированного HTML-файла содержит определенных языковых символов.

Когда я запускаю файл JAR из каталога Project -> dist, HTML не содержит определенные языковые символы.

Например, такие символы, как: č , ć , đ, š экспортируются как : Ä� , при запуске из NetBeans они экспортируются как таковые, а не как этот странный символ. Речь идет о письмах на сербском, хорватском и боснийском языках.

Когда я экспортирую проект из NetBeans, я обязательно включил этот параметр: Проект -> Свойства проекта -> Сборка -> Упаковка, где выбран параметр «Копировать зависимые библиотеки».

Я озадачен этим моментом. Если у кого-нибудь есть идеи, почему что-то работает в IDE одним способом, а при экспорте другим, сообщите мне.

Вы должны получить гораздо более конкретную информацию о проблеме

g00se 20.03.2022 23:10

@g00se g00se Я думаю, это подробно объяснено. Пожалуйста, дайте мне знать, какую часть вы считаете проблематичной?

Adrian Ivasku 20.03.2022 23:13

Так, например, вы хотите, чтобы мы указали угадать, какие "специфические языковые символы" являются проблемой?

g00se 20.03.2022 23:15

@ g00se Обновил эту информацию в вопросе. Спасибо.

Adrian Ivasku 20.03.2022 23:19

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

g00se 20.03.2022 23:30
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
5
35
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вероятная проблема заключается в том, что ваш файл HTML должен идентифицировать свой кодировка символов. В настоящее время, как правило, лучше всего использовать UTF-8 в качестве кодировки для большинства целей.

Определяем кодировку файла

Если у вас есть доступ к исходному коду вашего Java-приложения, изучите его, чтобы узнать, какая кодировка символов используется при создании HTML-файла. Но я предполагаю, что у вас нет такого доступа.

Откройте файл HTML в Текстовый редактор, чтобы изучить исходный код. Посмотрите, указывает ли он кодировку символов. Если это так, и этот индикатор кодировки символов неверен, вам нужно будет изменить свой HTML-файл.

Если в HTML не указана кодировка символов, вам нужно будет поэкспериментировать, чтобы определить кодировку. Откройте файл HTML в веб-браузере, затем используйте «просмотр» или инструменты разработчика, доступные в большинстве браузеров (Firefox, Safari, Edge и т. д.), чтобы явно переключаться между кодировками.

screenshot of Safari text-encoding menu

Если переключение на определенную кодировку приводит к тому, что текст выглядит так, как ожидалось, то вероятная кодировка вам известна.

Укажите кодировку файла

В современной версии HTML HTML5, UTF-8 — это кодировка по умолчанию, принимаемая веб-браузером. Но если веб-браузер переключится на Причудливый режим, браузер может принять другую кодировку. Чтобы избежать Quirks Mode, документ HTML5 должен начинаться с <!DOCTYPE html>.

Итак, лучше всего указать кодировку. Как только вы определите кодировку, используемую вашим приложением Java, создающим файл HTML, либо измените это приложение (если у вас есть исходный код), чтобы написать индикатор кодировки, либо напишите другое приложение Java, чтобы отредактировать созданный файл HTML, чтобы включить индикатор. Если вы не являетесь разработчиком Java, вы можете использовать любой язык программирования или даже сценарий оболочки для редактирования созданного HTML-файла.

Чтобы указать кодировку файла HTML5, добавьте meta элемент.

Для UTF-8:

<meta charset = "UTF-8">

Для латиница-1:

<meta charset = "ISO-8859-1">

Если ваше Java-приложение было разработано исключительно для Microsoft Windows, разработчик мог сознательно или непреднамеренно использовать одну из кодировок символов, определенных Microsoft. В более старых версиях Java по умолчанию использовалась кодировка символов, специфичная для хост-платформы, но имейте в виду, что в Java 18+ по умолчанию меняется на UTF-8 для разных платформ.

Для получения дополнительной информации

Вы можете прочитать об этих проблемах в многие местах. Например, здесь и в Википедии.

Если вы не разбираетесь в наборах символов и кодировке символов, я настоятельно рекомендую прочитать удивительно интересную статью Абсолютный минимум, который каждый разработчик программного обеспечения обязательно должен знать о Unicode и наборах символов (без оправданий!) Джоэла Спольски.

Спасибо за подробное объяснение. Я проверил упомянутую вами ссылку и кодировку UTF файла HTML, я добавил упомянутую вами кодировку, и она изменила странные символы с одного типа на другие странные символы. Попробую поиграться с кодировками и обновить. Что еще меня озадачивает, что файл который работает и этот идентичны :(

Adrian Ivasku 20.03.2022 23:46

Информация от Василия хороша, но указание кодировки символов только в выводе html не поможет вам, если то, что вы указываете, не представляет кодировку файла действительный (что, я подозреваю, не так)

g00se 20.03.2022 23:48

@AdrianIvasku «играть с кодировками» — точно. Если у вас нет доступа к исходному коду, чтобы увидеть, какая кодировка символов используется, вам просто придется экспериментировать методом проб и ошибок, чтобы определить кодировку, которая, вероятно, используется. Но, как я уже сказал, если приложение полагается на кодировку хост-платформы по умолчанию, то повторное развертывание вашего приложения на другую платформу изменит кодировку, а переход на Java 18 изменится на UTF-8.

Basil Bourque 20.03.2022 23:49

Комментарий от Boxofbeer важен: посмотрите на исходный код сгенерированного HTML-файла, чтобы увидеть, указывает ли он charset. Если это так, и это неправильно, вам нужно будет изменить эту часть сгенерированного HTML-файла.

Basil Bourque 20.03.2022 23:51

Если вы разместите ссылку на html-файл с проблемными символами, мы можем посмотреть

g00se 21.03.2022 00:00

@ g00se конечно. Вот HTML, экспортированный из NetBeans (codeshare.io/YLRBQm), и файл, экспортированный при запуске файла JAR (codeshare.io/OdzAjN). Это безумие, потому что оба файла не содержат информации о кодировке и идентичны. Один работает, другой нет.

Adrian Ivasku 21.03.2022 00:03

Windows-1250 вполне может быть фактической кодировкой

g00se 21.03.2022 00:18

Спасибо за подробное объяснение и время. Я думаю, что исправил это, добавив кодировку UTF в файл XML, который я использую в качестве источника для получения файла HTML. Хотя кодировка не включена в файл HTML, она как-то работает. Я поставлю это как ответ.

Adrian Ivasku 21.03.2022 00:24

Переход на Windows-1250 заставляет ваш html работать, но вам нужно написать его в своем приложении, правильно закодированном как UTF-8.

g00se 21.03.2022 00:30

Другие вопросы по теме