Windows 7 UTF-8 та Unicode


14

Чи не могли б хто-небудь пояснити, що змінилося в Windows 7 (64-розрядний Pro)?

Докладніше: Раніше у мене був Windows XP і були деякі файли перекладів (закодовані UTF-8) у форматі CSV. Мені вдалося переглянути шрифти як у Блокноті, так і в Excel. Після оновлення до Windows 7, коли я відкриваю ці файли - все, що я бачу, - це квадратні коробки (просто ви знаєте, якщо я відкрию їх у браузері - мені вдалося побачити весь переклад). Якщо я збережу ці файли в Unicode, все здається нормально.

Отже, що саме відбувається? Чому Windows 7 працює з Unicode, а не з UTF-8?

Відповіді:


30

Чому Windows 7 працює з Unicode, а не з UTF-8?

Термінологія

Unicode та UTF-8 - це не та сама річ: Unicode - це набір символів, який визначає набір символів (репертуар) та призначає числа (кодові точки) кожному з цих символів. UTF-8 - це одне з декількох кодувань, яке може використовуватися для представлення потоку символів Unicode на диску або в передачі. Наприклад, той самий потік символів Unicode також може бути закодований як UTF-16, UTF-32 або UTF-7.

Тим НЕ менше, Notepad пропонує вам «кодують» варіанту , включаючи ANSI, Unicode, Unicode big-endianі UTF-8. Розробники Microsoft, які це написали, використовували неправильні терміни. Коли вони говорять "Unicode", вони, швидше за все, означають " UTF-16 little-endian ". Коли вони говорять "ANSI", вони мають на увазі код сторінки 1252 (CP-1252).

Блокнот Microsoft

Я вважаю, що Блокнот Microsoft пише UTF-16 з позначкою порядку байтів ( BOM ) і що Блокнот шукає BOM під час читання текстового файлу. BOM повідомляє програмі, що файл UTF-16, і вказує, чи є він великим або маленьким.

Якщо Блокнот не знаходить BOM, він викликає функцію бібліотеки IsTextUnicode, яка розглядає дані та намагається відгадати, яке кодування було використано. Іноді (неминуче) він здогадується неправильно. Іноді здогадується, що файл "ANSI" - це "Unicode". Спроба інтерпретувати файл UTF-16 або UTF-8 як код сторінки 1252 призведе до того, що він відображатиме неправильні гліфи та не може знайти глифи, щоб надати деякі 8-бітні значення - вони потім відображатимуться як квадрати.

Як говорить у своїй відповіді harrymc , існують кращі альтернативи «Блокноту». Але Блокнот дозволяє явно вибрати кодування під час відкриття файлу (а не залишати Блокнот, щоб спробувати здогадатися).

Байтові позначки

За даними консорціуму Unicode, позначки байтів (BOMs) не є обов'язковими. Однак Windows покладається на BOM, щоб розрізняти деякі кодування.

Отже, коротше, можливо, вашим файлам чомусь не вистачало BOM? Можливо, BOM був загублений десь під час оновлення?

Якщо у вас все ще є оригінальні файли, які відображаються у вигляді квадратів, ви можете зробити шістнадцятковий дамп з них, щоб побачити, чи містять вони BOM.


Прості стандарти текстових файлів

Проблема полягає в тому, що їх фактично немає - немає універсальних стандартів для текстових файлів. Натомість у нас є низка несумісних та невідомих.

  • Як позначені закінчення рядків? Деякі платформи використовують контрольні символи Carriage Return (CR) з наступним подачею ліній (LF), деякі використовують CR окремо, а деякі використовують LF поодинці.

  • Чи є вищезгадані термінатори чи роздільники? Це впливає на кінець файлу, і, як відомо, воно може спричинити проблеми.

  • Обробка вкладок та інших контрольних символів. Можна припустити, що вкладка використовується для вирівнювання до кратної 8 стандартних ширин символів від початку рядка, але насправді в цьому немає впевненості. Багато програм дозволяють змінювати положення вкладок.

  • Набір символів та кодування? Не існує універсального стандарту, який би вказував, який із них використано для тексту у файлі. Найближчим із них є пошук BOM, який вказує на те, що кодування є одним із тих, що використовуються для Unicode. За значенням BOM програма, що читає файл, може відрізняти UTF-8 та UTF-16 тощо, а також між Little-Endian та Big-Endian варіантами UTF-16 тощо. Не існує універсального стандарту, який би вказував на те, що файл кодується в будь-якому іншому популярному кодуванні, такому як CP-1252 або KOI-8.

І так далі. Жоден з перерахованих вище метаданих не записується у текстовий файл - тому кінцевий користувач повинен повідомити програму під час читання файлу. Кінцевий користувач повинен знати значення метаданих для будь-якого конкретного файлу або ризикувати, що їх програма використовуватиме неправильні значення метаданих.

Буш приховував факти

Спробуйте це на Windows XP.

  • Відкрийте блокнот.
  • Встановіть шрифт на Arial Unicode MS. (Вам може знадобитися встановити його спочатку; якщо ви не бачите його в меню, натисніть "Показати більше шрифтів".)
  • Введіть текст "Буш приховував факти".
  • Виберіть Save As. У Encodingменю виберіть ANSI.
  • Закрийте блокнот.
  • Повторно відкрийте документ (наприклад, використовуючи Start, My Recent Documents).
  • Ви побачите 畂 桳 栠 摩 琠 敨 映 捡 獴 замість "Буш приховував факти".

Це ілюструє, що IsTextUnicodeфункція, яку використовує Блокнот, неправильно здогадується, що текст ANSI (справді Код сторінки 1252) є Unicode UTF-16LE без BOM. У файлі, збереженому як, немає BOM ANSI.

Windows 7

У Windows 7 Microsoft налаштувала IsTextUnicodeтак, щоб цього не відбулося. За відсутності BOM тепер більше шансів здогадатися про ANSI (CP 1252), ніж Unicode (UTF-16LE). У Windows-7 , я очікую , що ви, таким чином , більш імовірно , буде мати зворотну задачу: Файл , що містить символи Unicode з кодами більше 255, але без BOM, тепер більш імовірно, здогадалися , як ANSI - і тому відображається неправильно.

Запобігання проблемам з кодуванням

В даний час найкращим підходом є використання UTF-8 скрізь. В ідеалі ви б перекодувати всі старі текстові файли в UTF-8 і зберегти лише текстові файли як UTF-8. Є такі інструменти, як recode та iconv, які можуть допомогти у цьому.


3
Згідно з Вікіпедією : у Windows Vista та Windows 7 [..] IsTextUnicode було змінено, щоб набагато частіше було здогадуватися про кодування на байті, а не для UTF-16LE.
Ар'ян

Так, напевно, у цих файлів є BOM, оскільки ми генеруємо цей файл із BOM. Цікаво, що Windows 7 не читає BOM, створений старшою ОС.
Ша Ле Ле

BOM не змінився. Можливо, у ваших файлах відсутня BOM, але раніше формат за замовчуванням був деяким варіантом Unicode, де зараз це ASCII. Дивіться мою відповідь.
harrymc

@Sha Le: Якщо у файлі є BOM, Блокнот Windows 7 повинен відкрити його правильно, тому описана вами проблема не відповідає відомим проблемам isTextUnicode. Чи можете ви створити невеликий зразок-файл, який ілюструє проблему, яка виникає з файлом, який включає BOM?
RedGrittyBrick

Також є this app can breakтакий же ефект, що іBush hid the facts
Регент

3

Зауваження: Ви можете використовувати Notepad ++ для перегляду файлів тез, використовуючи меню «Кодування».

Після того, як файли відображаються правильно, їх збереження додасть правильний BOM.


Я знаю, що цей пост трохи старий, але в даний час у мене є проблема з win 7 і блокнотом ++, не відображаючи UTF 8 без BOM, коли файли спочатку створювалися за допомогою самого блокнота ++ v5.9.6.2.
Джейк

@Jake: Переконайтесь, що в меню кодування відображається "Кодувати в UTF8", а не "Кодувати в UTF8 без BOM".
harrymc

1

У Windows 10 можливо (тест на 1903 збірку)

  1. Скопіюйте свій файл із хорошим кодуванням TXTUTF-8.txtв C:\WINDOWS\SHELLNEW.
  2. В HKEY_CLASSES_ROOT\.txt\ShellNewзробити нову ланцюжок з ім'ям « FileName»
  3. Змініть значення " FileName" на " TXTUTF-8.txt"

Тепер, коли ви створюєте новий файл txt за допомогою меню Windows, він прийме ваш TXTUTF-8.txtшаблон

Джерело: https://answers.microsoft.com/fr-fr/windows/forum/all/configurer-lencodage-par-d%C3%A9faut-en-utf-8-dans/9c0358ca-a2b3-43e8-a154- d10c1fe94317

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.