Есть класс Pet с полем name и методом setName(), реализованным самым обычным способом this.name = name;
Также есть класс Cat extends Pet в котором я переопределяю метод setName()
Теперь описываю саму ситуацию:
Так как магических вариаций слишком много - попробую структурировать и записать последовательно.
При переопределении метода setName() пробовал писать this.name = "Я - кот"; , а так-же super.setName("Я - кот"); результат идентичен.
-----------------------------------------------------------------
Эксперимент №1:
1. Только что поставил кодировку
2. Project encoding: UTF-8
3. вывод в консоль: Я - кот Эксперимент № 2:
1. Переключился на браузер дополнил вопрос, вернулся в IDEA, ничего не менял, запускаю
2. Project encoding: UTF-8
3. вывод в консоль: � - ��� Эксперимент № 3:(Для чистоты эксперимента - повторил эксперимент №2)
1. Переключился на браузер дополнил вопрос, вернулся в IDEA, ничего не менял, запускаю
2. Project encoding: UTF-8
3. вывод в консоль: � - ��� Эксперимент № 4:
1. Переключился на браузер дополнил вопрос, вернулся в IDEA, поменял кодировку, запускаю
2. Project encoding: windows-2151
3. вывод в консоль: Я - кот Эксперимент № 5:
1. Переключился на браузер дополнил вопрос, вернулся в IDEA , ничего не менял, запускаю
2. Project encoding: windows-2151
3. вывод в консоль: РЇ - РєРѕС‚ Эксперимент № 6:
Для чистоты эксперимента - повторил эксперимент № 5, результат идентичен! -----------------------------------------------------------------
И сам вопрос: Пожалуйста, объясните, что вообще происходит и почему так???
Богдан
18 уровень
Динамическое изменение кодировки при наследовании, почему так, что за магический беспредел? 🧙♂️🤔😰
Обсуждается
Комментарии (9)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
ГоффMaster
24 июля 2022, 10:51
Похожий был вопрос от Ады.
Смотри, в эксперименте 2 и 3 с кодировками всё нормально. Это видно по количеству выводимых символов. Просто в шрифте, которым происходит вывод, отсутствуют кириллические буковки. Код буковок нормальный, просто их в шрифте нет, поэтому показывает знаки вопроса - оно просто не знает, как выглядят буковки, которые надо вывести.
В эксперименте 5 проблема именно с кодировкой - это видно по тому, что вместо одного символа выводятся два. Уникод кодирует символ двумя байтами, аски - одним. Соотвественно текст в уникодной кодировке, если его раскодировать кодировкой аски (win1251), будет выглядеть именно вот так - по две неправильные буковки вместо одной правильной.
Надо ещё учесть, что кириллические буковки могли потеряться и по дороге. То-есть, пока ты туда-сюда ппереключался на каком-то этапе какая-то инстанция заменила отсутствующие в шрифте кириллические буковки вот этим самым символом со знаком вопроса и передала дальше. Даже если на конечном устройстве стоит полный шрифт, показывать он будет всё равно знаки вопроса - то, что ему пришло, то он и покажет.
Постарался объяснить не сумбурно =)
+1
Богдан
24 июля 2022, 10:56
Захотелось погладить и накормить, каждую "буковку"🤭
А если серьёзно - спасибо за ответ конечно, но очень сложно читать про "буковок", не отвечайте пж. так никому. Сделал 4 попытки прочесть, это сложней задач с пометкой Hard, попробую вернуться в 2 часа ночи, когда буду сильно хотеть спать🤷♂️
0
ГоффMaster
24 июля 2022, 11:32
Перечитал, поржал, да, а ведь старался максимально просто.
На самом деле всё и есть просто, если въехать откуда берётся то, что ты видишь на экране.
Символы, они же буковки, хранятся в памяти компьютера в виде числовых кодов. А шрифт - это таблица, где каждому коду соответствует картинка - как выглядит символ с этим кодом. Эту картинку нам и показывают вместо числового кода. Грубо говоря, в файле на самом деле байт со значением 41, а нам вместо кода 41 показывают соответствующую картинку из шрифта с изображением буквы А. Меняешь шрифт - меняется и картинка, хотя коды остаются без изменений.
Но если в установленном шрифте нет картинки для нужного кода? Если картинки для нужного кода в шрифте нет, то тогда при выводе этот код заменяется на код специального символа, в конкретном твоём случае символа �. Поэтому вместо символов кириллицы ты видишь ромбики с вопросом.
Это может быть и другой символ - просто знак вопроса (?) или перечёркнутый квадратик, или вот файерфокс на оупенсюзе показывает квадратик с кодом символа (𐌼), в разных реализациях по-разному.
В конкретном случае в эксперименте 2 и 3 с кодировкой всё нормально, но в шрифте, который установлен или подключён для вывода в консоль, отсутствуют кириллические буквы.
Спокойной ночи =)
+1
Ada
24 июля 2022, 07:13полезный
У меня были проблемы с кодировкой, и я попробовала установить JDK 17, пока все ок, полет нормальный)
+1
Vladyslava
22 июля 2022, 22:07
Я много чего пробовала, но помогла мне лишь отчаяная мера. Я снесла идееху и поставила наново
+1
Никита Ильин
22 июля 2022, 20:04
аналогично, меня это уже заебало. Постоянно меняю кодировку
+1
Ada
22 июля 2022, 20:03полезный
Не сталкивалась с таким, но вот в этой статье на хабре наткнулась на такую фразу: Поведение JVM в случае изменения окружения после старта становится непредсказуемо. 🤔
+3
Богдан
22 июля 2022, 20:15
Интересная статья, спасиб)
0
ГоффMaster
24 июля 2022, 11:01
Отлично в статье разложено, проблема очень в стиле джавы.
0