Очередной фокус с микрософтовским продуктом.
Сразу оговорюсь: точно работает под Windows XP, в висте и семёрке не проверял.

Откроем блокнот ( Windows+R, notepad, Enter ) и напишем:

яюлевсегдапишубезпробелов!
потому что она мне так пишет!!!

и сохраним результат на рабочий стол под именем test.txt. Закрываем блокнот.

Открываем файл заново и впечатляемся.
Красиво, правда?


Всё дело в волшебном сочетании символов «яю» в начале файла. Создайте новый текстовый документ, введите (или скопируйте) туда любой текст, поставьте первыми символами «яю» - и всё, блокнот его больше не прочитает. Вернее, блокнот-то прочитает, вы не прочитаете.

Символы «яю» в стандартной windows-кодировке (cp-1251) представляют собой сочетание байт FFFE (в шестнадцатиричном представлении). Это сочетание указывает блокноту (и ряду других текстовых редакторов), что документ надо читать в кодировке юникода.

Помимо сочетания «яю» работает ещё «юя» и некоторые комбинации этих символов с другими буквами, цифрами и символом переноса строки (см. комментарии).

И вот это уже по-настоящему смешно, потому что:

  1. В тексте UTF-8 принципиально не может быть байтов со значениями 254 (0xFE) и 255 (0xFF). Поскольку в Юникоде не определены символы с кодами выше 221, то в UTF-8 оказываются неиспользуемыми также значения байтов от 248 до 253 (0xF8—0xFD). Если запрещены искусственно удлинённые (за счёт добавления ведущих нулей) последовательности UTF-8, то не используются также байтовые значения 192 и 193 (0xC0 и 0xC1).

    http://ru.wikipedia.org/wiki/UTF-8
  2. Выбрать кодировку для сохранения в блокноте нельзя. Новый документ будет сохранён в кодировке cp-1251.
  3. При сохранении нового файла блокнот не проверяет текст на наличие "инструкций" — "опасных" сочетаний символов.
  4. При чтении нашего файла блокнот тупо следует инструкциям и пытается вывести текст в юникоде.
  5. Переключения кодировок в блокноте нет.

Вдобавок,

Многие программы Windows (включая Блокнот) добавляют байты 0xEF, 0xBB, 0xBF в начале любого документа, сохраняемого как UTF-8. Это метка порядка байтов Юникода (англ. Byte Order Mark, BOM), также её часто называют сигнатурой (соответственно, UTF-8 и UTF-8 with Signature). По наличию сигнатуры программы могут автоматически определить, является ли файл закодированным в UTF-8, однако файлы с такой сигнатурой могут некорректно обрабатываться старыми программами, в частности xml-анализаторами. Такие редакторы, как Notepad++, Notepad2 и Kate, позволяют явно указывать, следует ли добавлять сигнатуру при сохранении UTF-файлов.

(http://ru.wikipedia.org/wiki/UTF-8), но винда вместо байт EFBBBF использует именно FFFE. Это легко проверить — например, экспортировав любую ветку реестра (по умолчанию reg-файлы сохраняются в кодировке юникода) и открыв получившийся файл с помощью шестнадцатиричного редактора.

Заставим баги микрософта работать на себя: такое поведение блокнота можно использовать в качестве шифрования документов, чтобы чайники их не прочитали.

А лучше вместо блокнота сразу поставить или Notepad++, или FAR Manager, или оба сразу.


Vladimir
2010.09.22 16:26:22
#cid383

Ответить

Да, всё так. Только что проверил. Но если после сохранения файла открыть его снова, удалить квадратики и вставить тот же текст и сохранить снова, то текст читается нормально. Как это можно объяснить?

2010.09.22 17:08:35
#cid384

Ответить

Символы «яю» в стандартной windows-кодировке (cp-1251) представляют собой сочетание байт FFFE (в шестнадцатиричном представлении). Это сочетание указывает любому текстовому редактору, что документ надо читать в кодировке юникода.

Соответственно, при повторной вставке текста, он сохраняется уже в юникоде и после этого открывается-читается без проблем.

ник
2011.11.02 03:41:51
#cid7308

Ответить

я заметил что не что подобное написать в блокноте тока в начале поставить я с цифрой или заглавной буквой английского алфавита до буквы "т" или просто я и скобка.

2011.11.10 19:21:42
#cid7764

Ответить

я заметил что не что подобное написать в блокноте тока в начале поставить я с цифрой или заглавной буквой английского алфавита до буквы "т" или просто я и скобка.

Спасибо! Не знал.

imen
2012.09.29 21:14:19
#cid42703

Ответить

А лучше вместо блокнота сразу поставить или Notepad++, или FAR Manager, или оба сразу.

Не рекомендуй бяку.
Ведь есть же http://www.vim.org/
А фар так вообще не нужен.

2012.09.30 05:23:47
#cid42726

Ответить

#cid42703, imen

Не рекомендуй бяку.
Ведь есть же http://www.vim.org/

Пользование виндузом подразумевает определённый склад ума и набор стереотипов, типа "интуитивно-понятного интерфейса".

А фар так вообще не нужен.

Всё правильно. Пользователям виндуз и FAR-то, собственно, не нужен. Так какой смысл говорить про vi?

imen
2012.09.30 08:57:29
#cid42742

Ответить

Пользователям виндуз и FAR-то, собственно, не нужен.

Пользователям не-виндавса фар тем более не нужен.
Особенно с учётом того факта, что на платформах, отличных от виндавса оно и не живёт.

Magos
2012.11.07 16:30:47
#cid47168

Ответить

был и такой трюк, для фразы с латинскими символами:

Bush hid the facts

эффект тот же

2012.11.07 18:03:22
#cid47175

Ответить

#cid47168, Magos

был и такой трюк, для фразы с латинскими символами:

Bush hid the facts

эффект тот же

Проверил, работает. Но это пасхалка, а не баг.

Кодировка ANSI, латинские символы — блокнотом должно открываться нормально. Вдобавок, квадраты появляются только если фраза написана слово в слово. При малейшем изменении эффект пропадает.