У меня есть классическое Java-приложение для ПК. Результатом сборки является файл JAR, который работает на компьютере с Windows.
Приложение читает некоторые XML-файлы и в результате создает HTML-документ. Файл Xml содержит определенные языковые символы, которые не являются родными для английского языка.
Во время разработки в среде IDE (Apache NetBeans 13) сборка -> запуск экспортированного HTML-файла содержит определенных языковых символов.
Когда я запускаю файл JAR из каталога Project -> dist, HTML не содержит определенные языковые символы.
Например, такие символы, как: č , ć , đ, š экспортируются как : Ä� , при запуске из NetBeans они экспортируются как таковые, а не как этот странный символ. Речь идет о письмах на сербском, хорватском и боснийском языках.
Когда я экспортирую проект из NetBeans, я обязательно включил этот параметр: Проект -> Свойства проекта -> Сборка -> Упаковка, где выбран параметр «Копировать зависимые библиотеки».
Я озадачен этим моментом. Если у кого-нибудь есть идеи, почему что-то работает в IDE одним способом, а при экспорте другим, сообщите мне.
@g00se g00se Я думаю, это подробно объяснено. Пожалуйста, дайте мне знать, какую часть вы считаете проблематичной?
Так, например, вы хотите, чтобы мы указали угадать, какие "специфические языковые символы" являются проблемой?
@ g00se Обновил эту информацию в вопросе. Спасибо.
Ну, вам, вероятно, нужно правильно установить кодировку символов в выводе. На входе наверное тоже
Вероятная проблема заключается в том, что ваш файл HTML должен идентифицировать свой кодировка символов. В настоящее время, как правило, лучше всего использовать UTF-8 в качестве кодировки для большинства целей.
Если у вас есть доступ к исходному коду вашего Java-приложения, изучите его, чтобы узнать, какая кодировка символов используется при создании HTML-файла. Но я предполагаю, что у вас нет такого доступа.
Откройте файл HTML в Текстовый редактор, чтобы изучить исходный код. Посмотрите, указывает ли он кодировку символов. Если это так, и этот индикатор кодировки символов неверен, вам нужно будет изменить свой HTML-файл.
Если в HTML не указана кодировка символов, вам нужно будет поэкспериментировать, чтобы определить кодировку. Откройте файл HTML в веб-браузере, затем используйте «просмотр» или инструменты разработчика, доступные в большинстве браузеров (Firefox, Safari, Edge и т. д.), чтобы явно переключаться между кодировками.
Если переключение на определенную кодировку приводит к тому, что текст выглядит так, как ожидалось, то вероятная кодировка вам известна.
В современной версии 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, я добавил упомянутую вами кодировку, и она изменила странные символы с одного типа на другие странные символы. Попробую поиграться с кодировками и обновить. Что еще меня озадачивает, что файл который работает и этот идентичны :(
Информация от Василия хороша, но указание кодировки символов только в выводе html не поможет вам, если то, что вы указываете, не представляет кодировку файла действительный (что, я подозреваю, не так)
@AdrianIvasku «играть с кодировками» — точно. Если у вас нет доступа к исходному коду, чтобы увидеть, какая кодировка символов используется, вам просто придется экспериментировать методом проб и ошибок, чтобы определить кодировку, которая, вероятно, используется. Но, как я уже сказал, если приложение полагается на кодировку хост-платформы по умолчанию, то повторное развертывание вашего приложения на другую платформу изменит кодировку, а переход на Java 18 изменится на UTF-8.
Комментарий от Boxofbeer важен: посмотрите на исходный код сгенерированного HTML-файла, чтобы увидеть, указывает ли он charset
. Если это так, и это неправильно, вам нужно будет изменить эту часть сгенерированного HTML-файла.
Если вы разместите ссылку на html-файл с проблемными символами, мы можем посмотреть
@ g00se конечно. Вот HTML, экспортированный из NetBeans (codeshare.io/YLRBQm), и файл, экспортированный при запуске файла JAR (codeshare.io/OdzAjN). Это безумие, потому что оба файла не содержат информации о кодировке и идентичны. Один работает, другой нет.
Windows-1250 вполне может быть фактической кодировкой
Спасибо за подробное объяснение и время. Я думаю, что исправил это, добавив кодировку UTF в файл XML, который я использую в качестве источника для получения файла HTML. Хотя кодировка не включена в файл HTML, она как-то работает. Я поставлю это как ответ.
Переход на Windows-1250 заставляет ваш html работать, но вам нужно написать его в своем приложении, правильно закодированном как UTF-8.
Вы должны получить гораздо более конкретную информацию о проблеме