ilyachalov (ilyachalov) wrote,
ilyachalov
ilyachalov

Categories:

Широкие символы в Windows

Записал (в режиме ios::binary) в файл объект класса, у которого два поля (C++):
wchar_t name[80]; // имя
short age;        // возраст

Что получилось:



Тут видно, как в Windows реализованы широкие символы (wchar_t). Каждый такой символ занимает 2 байта в кодировке UTF-16LE (в Linux, как пишут, широкий символ занимает 4 байта в кодировке UTF-32).

Обозначение «LE» (little endian) касается порядка, в котором в память записываются младший и старший байты широкого символа: в данном случае байты переставлены наоборот — сначала записан младший байт, затем старший.

На картинке видно, что файл занимает 162 байта. Первые 160 байт занял массив (еще такой массив часто называют буфером) из 80 широких символов (каждый по 2 байта). Последние 2 байта — целое число типа short.

В массиве хранится нуль-терминированная строка, содержащая имя «Илья», которая занимает 10 байт (8 байт под четыре буквы имени, на каждую букву — по 2 байта; и еще 2 байта — под нулевой символ):
18 04 3B 04 4C 04 4F 04 00 00
Чтобы стало еще понятнее, отделим каждые 2 байта друг от друга точками:
18 04 . 3B 04 . 4C 04 . 4F 04 . 00 00
Поменяем байты в каждой паре местами (из-за порядка байтов «LE», о чем писалось выше), чтобы получить номер символа в таблице Юникода:
04 18 . 04 3B . 04 4C . 04 4F . 00 00
То есть:
U+0418 . U+043B . U+044C . U+044F . U+0000
Или
И . л . ь . я . NUL

Последние 2 байта в файле, как уже писалось выше, являются целым числом типа short:
5F 00
Байты тут тоже расположены в порядке «LE», поэтому их следует поменять местами:
00 5F
Переведя из шестнадцатеричной системы счисления в десятичную, получим число 95.
Tags: Математика, Образование, Программирование
Subscribe

  • JavaScript: Blob

    Прочел подраздел 2.3 « Blob» третьей части учебника по JavaScript. Для меня эта статья оказалась настолько объемной в плане нового, что ее разбор…

  • Сказка про двоичные данные, кодировку Windows-1251 и Юникод

    Вопрос из комментариев к подразделу 2.3 « Blob» третьей части учебника по JavaScript, цитата: Не могу найти способ выдавать файл с кодировкой…

  • Как работает кодирование Base64, окончание

    Начало: « Как работает кодирование Base64». Пример второй. « Картинка-смайлик» В предыдущем примере кусок двоичных данных, содержащий текст,…

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your IP address will be recorded 

  • 0 comments