luchob/softuni-sep-2023

Issue with changing the languages with Interceptor

Closed this issue · 5 comments

Връзка към проекта:

връзка

Кратко описание:

След като сменя езика на Български, само ? се визуализират заради енкодинга (предполагам).

Възможно най-накратко опишете:

  1. Какво очаквате да се случи --> Да сменя езика само на навигационния бар.
  2. Какво всъщност се случва --> Получавам грешен енкодинг. Или така мисля.
  3. Какво опитахте --> В нета изтествах доста различни решения и нито едно не ми свърши работа

Стъпки за репродуциране:
Като достъпиш local сменя езика на български и край.
А на същия линк но с en, се връща на английски и е ок там.

Здравей!

Ако забележиш в долния десен ъгъл на редактора в IntelliJ, ти пазиш пропърти файловете си в ISO-8859-1.

Screenshot 2023-12-08 at 11 21 34

Това е кодова таблица, разширение на ASCII и предназначена за латински букви. Обяснявах го на една от първите лекции, която според мен беше забавна :-) Дори си ги повредил като си ги качвал в Github, допускам отново заради опит за конвертиране от кирилица в ISO-8859-1.

Преди Java 9 всички пропърти файлове трябваше да се пазят в такъв енкодинг (допускам затова е default в IntelliJ), но от Java 9 натам се поддържа UTF-8 по подразбиране. Можеш да настроиш енкодинга по подразбиране в IntelliJ и да оправиш файловете:

Screenshot 2023-12-08 at 11 33 11

Това пък е примерна конфикурация:

    @Bean
    public MessageSource messageSource() {

        ResourceBundleMessageSource resourceBundleMessageSource = new ResourceBundleMessageSource();
        resourceBundleMessageSource.setBasename("messages");
        resourceBundleMessageSource.setDefaultEncoding("UTF-8");//<-- utf 8
        return resourceBundleMessageSource;
    }

CharacterEncodingInterceptor не мисля, че ти е необходим изобщо.

Поздрави,
Л.

Здравей Лъчо, как съм ги повредил? Като съм ги качил?

Разбрах те и го оправих благодаря за помощта, както винаги 🤟🤟🍺🍺🍺🤟🤟

Супер! Но за протокола: как си ги повредил?

Ами сравнително просто. Като напишеш например буквичката "Л" (при мен на БДС се явява като напиша символа >) към редактора на IntelliJ който очевидно ползва и UTF-8 вътрешно, поемат 2 байта, вместо 1. Това са D0 (D0 hex, 208 десетични) и 9B (9B hex, 155 десетични). В UTF-8 "Л" се кодира като двубайтова последователност D0 9B, както може да видиш и в линка отгоре.

Само че ISO-8859-1 e еднобайтова кодова таблица и затова за нея това са 2 символа, а не 1.

208 (D0) е някаква исландска буква "Ð".

155 (9B) не е дефиниран в ISO-8859-1 но в Latin-1 това е т.нар. Control Sequence Introducer, който може да се ползва в разни антични скриптчета, терминали и т.н.

Само че, идва проблем - редакторът трябва да направи нещо с тези два безмислени байта когато поискаш да запишеш файла с еднобайтов енгодинг. А те са наистина безмислени в ISO-8859-1 (където няма буква Л) и затова ги заменя с един "?". Оттам се получава "повреждането".

Ако направиш обратното, запишеш буквата Л в твоя properties файл с някакъв външен редактор и запишеш файла в UTF-8, а после го отвориш с IntelliJ с ISO-8859-1 редактор то ще видиш нещо такова:

Screenshot 2023-12-08 at 14 41 55

Тове е Ð + Control Sequence Introducer (CSI).

Поздрави,
Л.

Лъчо, благодаря. Изчерпателен както винаги. Тези два модула от web с теб бяха супер. Толкова индивидуален съпорт. Евала. Благодаря!