Странная ошибка декодирования utf8 в блокноте Windows - PullRequest
0 голосов
/ 15 апреля 2019

Если вы введете следующую строку в текстовый файл с кодировкой utf8 (без bom) и откроете ее с помощью notepad.exe, вы увидите на экране несколько утомленных символов.Но блокнот может на самом деле хорошо декодировать эту строку без последнего «а».Очень странное поведение.Я использую Windows 10 1809.

[19, 16, 12, 14, 15, 15, 12, 17, 18, 15, 14, 15, 19, 13, 20, 18, 16, 19, 14, 16, 20, 16, 18, 12, 13, 14, 15, 20, 19, 17, 14, 17, 18, 16, 13, 12, 17, 14, 16, 13, 13, 12, 15, 20, 19, 15, 19, 13, 18, 19, 17, 14, 17, 18, 12, 15, 18, 12, 19, 15, 12, 19, 18, 12, 17, 20, 14, 16, 17, 18, 15, 12, 13, 19, 18, 17, 18, 14, 19, 18, 16, 15, 18, 17, 15, 15, 19, 16, 15, 14, 19, 13, 19, 15, 17, 16, 12, 12, 18, 12, 14, 12, 16, 19, 12, 19, 12, 17, 19, 20, 19, 17, 19, 20, 16, 19, 16, 19, 16, 12, 12, 18, 19, 17, 18, 16, 12, 17, 13, 18, 20, 19, 18, 20, 14, 16, 13, 12, 12, 14, 13, 19, 17, 20, 18, 15, 12, 15, 20, 14, 16, 15, 16, 19, 20, 20, 12, 17, 13, 20, 16, 20, 13a

Интересно, это ошибка Windows или есть что-то, что я могу сделать, чтобы решить эту проблему.

1 Ответ

0 голосов
/ 29 апреля 2019

сделал больше исследований; разобрался.

Похоже на вариант классического случая "Буш скрыл факты". https://en.wikipedia.org/wiki/Bush_hid_the_facts

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

Но есть реальное объяснение того, что происходит:

  1. Блокнот проверяет последовательность байтов спецификации. Если он не находит один, у него есть 2 варианта: кодировка UTF-16 Little Endian (без спецификации) или простой ASCII. Сначала проверяется UTF-16 LE с помощью функции IsTextUnicode.

  2. IsTextUnicode запускает серию тестов, чтобы угадать , является ли данный текст Unicode или нет. Одним из таких тестов является IS_TEXT_UNICODE_STATISTICS, который использует статистический анализ. Если тест верен, то данный текст, вероятно, является Unicode, но абсолютная уверенность не гарантируется.
    https://docs.microsoft.com/en-us/windows/desktop/api/winbase/nf-winbase-istextunicode

  3. Если IsTextUnicode возвращает true, Блокнот кодирует файл с помощью UTF-16 LE, создавая странный вывод, который вы видели. Мы можем подтвердить это с помощью этого символа ㄠ. Соответствующие символы ASCII: «1» (пробел один); соответствующие шестнадцатеричные значения для этих символов ASCII составляют 0x20 для пробела и 0x31 для одного. Поскольку порядок байтов - Little Endian, порядок кодовой точки Unicode будет «1», или U + 3120, что можно подтвердить, если вы посмотрите эту кодовую точку.
    https://unicode -table.com / ен / 3120 /

Если вы хотите решить проблему, вам нужно разорвать шаблон, который помогает IsTextUnicode определить, является ли данный текст Unicode. Вы можете вставить новую строку перед текстом, чтобы разбить шаблон.

Надеюсь, это помогло!

...