понимание кодировок файлов

в eclipse у меня есть файл, где где-то это написано:

onclick='obj1.help_open_new_window(fn1(), "/redir/url_name")'

и в меню eclipse Edit-> установить кодировку я вижу это:

введите здесь описание изображения

Теперь я меняю кодировку на UTF-8, используя то же диалоговое окно, и текст меняется на:

onclick='obj1.help_open_new_window(fn1(),�"/redir/url_name")'

Все, что я знаю, это то, что если бы этого не происходило, то мой сайт работал бы нормально. Почему это происходит и что делать, чтобы этого не допустить?

У меня есть некоторые знания о кодировках: Â и объяснение тайны nbsp Абсолютный минимум Разработчик программного обеспечения Абсолютно, обязательно должен знать о Unicode и наборах символов (без оправданий!) но все же я не понимаю, почему это происходит. Не стесняйтесь переходить на уровень байтов (как хранится файл), просто чтобы объяснить это.

ОБНОВЛЕНИЕ: вот что я понимаю: если файл закодирован в latin-1, то каждый символ является байтом, как и . it should be hex(32). теперь, когда я конвертирую его в utf-8, он все еще остается hex(32), и это определенно . this leads me to believe that in latin-1, не hex(32), а комбинация двух байтов. Как это возможно?


person prongs    schedule 13.06.2012    source источник
comment
Если можете, откройте файл в шестнадцатеричном редакторе, чтобы узнать, какие байты на самом деле хранятся в файле в этот момент.   -  person AKX    schedule 13.06.2012


Ответы (1)


Символ, который у вас есть между запятой и кавычкой, кажется, не является обычным пробелом, а каким-то другим пробельным символом, вероятно, знаменитым U+00A0 НЕРАЗРЫВНЫЙ ПРОБЕЛ. Поскольку файл закодирован в формате latin1, символ сохраняется на диске как байт \xA0, который не является допустимым символом в UTF-8. Это означает, что если вы перезагрузите файл в своем редакторе, используя UTF-8, вы увидите вместо него универсальный символ замены . (Правильная кодировка UTF-8 для неразрывного пробела будет \xC2\xA0.)

Чтобы избавиться от этой проблемы, замените неразрывный пробел на обычный пробел (U+0020). Нет причин, по которым вы должны использовать неразрывный пробел в этом контексте, то есть в тексте программы.

person Joni    schedule 13.06.2012
comment
Хорошо, но зачем eclipse вставлять U+00A0 вместо U+0020 при нажатии пробела? - person prongs; 14.06.2012
comment
Возможно, кто-то скопировал и вставил этот код с веб-страницы, где использовался неразрывный пробел. Или, может быть, кто-то случайно набрал неразрывный пробел: у некоторых людей есть конфигурация, которая вставляет неразрывный пробел, например, при нажатии Shift+Пробел. Это часто приводит к ненужным пробелам в файлах, которые они редактируют. - person Joni; 14.06.2012