Issue with changing the languages with Interceptor
Closed this issue · 5 comments
Връзка към проекта:
Кратко описание:
След като сменя езика на Български, само ? се визуализират заради енкодинга (предполагам).
Възможно най-накратко опишете:
- Какво очаквате да се случи --> Да сменя езика само на навигационния бар.
- Какво всъщност се случва --> Получавам грешен енкодинг. Или така мисля.
- Какво опитахте --> В нета изтествах доста различни решения и нито едно не ми свърши работа
Стъпки за репродуциране:
Като достъпиш local сменя езика на български и край.
А на същия линк но с en, се връща на английски и е ок там.
Здравей!
Ако забележиш в долния десен ъгъл на редактора в IntelliJ, ти пазиш пропърти файловете си в ISO-8859-1.
Това е кодова таблица, разширение на ASCII и предназначена за латински букви. Обяснявах го на една от първите лекции, която според мен беше забавна :-) Дори си ги повредил като си ги качвал в Github, допускам отново заради опит за конвертиране от кирилица в ISO-8859-1.
Преди Java 9 всички пропърти файлове трябваше да се пазят в такъв енкодинг (допускам затова е default в IntelliJ), но от Java 9 натам се поддържа UTF-8 по подразбиране. Можеш да настроиш енкодинга по подразбиране в IntelliJ и да оправиш файловете:
Това пък е примерна конфикурация:
@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 редактор то ще видиш нещо такова:
Тове е Ð + Control Sequence Introducer (CSI).
Поздрави,
Л.
Лъчо, благодаря. Изчерпателен както винаги. Тези два модула от web с теб бяха супер. Толкова индивидуален съпорт. Евала. Благодаря!