Методичні вказівки з організації самостійної роботи студентів



При підготовці до лабораторної роботи необхідно повторити матеріал відповідних лекцій та ознайомитися з [3, с. 11-27].

Типи даних char і wchar_t. Універсальне завдання типу

При ANSI-кодуванні використовується тип даних char. Даному типа char виділяється один байт. Приклади використання цього типу:

char symbol = ‘x’;

char array [] = “This is array”;

При UNICODE-кодуванні використовується тип даних wchar_t. Даному типа wchar_t виділяється два байти. Приклади використання цього типу:

wchar_t symbol = L‘x’;

wchar_t array [] = L“This is array”;

Для створення універсального тексту програми, який можна використовувати для обох типів кодування можна використовувати макроси.

Приклад макросу для універсальної об’яви типу даних і їх ініціалізації:

#ifdef UNICODE

typedef  wchar_t TCHAR ;

#define   TEXT(a) L##a

#else

typedef char   TCHAR ;

#define   TEXT(a) a

#endif

В цьому макросі визначено універсальний тип TCHAR, значення якого залежить від того, визначена змінна UNICODE чи ні. За допомогою макроса TEXT до визначення літералу додається буква L або ні.

Розгляньте цей макрос! Він повинен бути зрозумілим!

Використаємо цей макрос для визначення символу та рядка в універсальному вигляді.

TCHAR symbol = TEXT(‘x’);

TCHAR array [] = TEXT(“This is array”);

Цей код відповідає ANSI кодуванню, якщо не визначено змінної UNICODE, і UNICODE, якщо визначена ця змінна.

 

Функції для роботи з рядками для ANSI і UNICODE кодувань

Функції для роботи з рядками для ANSI кодування визначено в файлі заголовків string.h. Більшість функцій починається з префіксу str, наприклад, strcpy, strcat, strlen,… .

Функції для роботи з рядками для UNICODE кодування визначено в тому ж файлі заголовків string.h. Більшість функцій починається з префіксу wcs, наприклад, wcscpy, wcscat, wcslen,… .

Визначимо універсальну функцію, наприклад, для знаходження довжини рядка (в символах):

#ifdef UNICODE

#define   _tcslen             wcslen

#else

#define   _tcslen             strlen

#endif

Аналогічно можно визначити усі функції для роботи з рядками.

Файл tchar.h. Пошук імен для універсальних функцій

Усі ці типи і функції вже визначені в файлі tchar.h. Підключить цей файл та розгляньте його.

Для того, щоб знайти ім’я універсальної функції необхідно відкрити файл tchar.h, та знайти в ньому визначення функції для ANSI кодування. Це визначення має такий же формат, який ми використовували для визначення функції strlen. Отримайте універсальне ім’я функції. Визначить ім’я головної функції консольного додатку (яке відповідає функції main).

Визначення типу тексту і перетворення типу кодування тексту

Нехай задано текст. Необхідно визначити, яке кодування використовується для завдання цього тексту.

Для цього можно використовувати функцію IsTextUnicode:

BOOL IsTextUnicode( CONST VOID* pBuffer, int cb, LPINT lpi );

де:

pBuffer – буфер з символами;

cb           - кількість символів в буфері;

lpi      - ознаки, по яким визначається тип кодування. Кожна ознака задається одним бітом. На вході зазвичай задають 1 в усіх бітах, тобто число -1. На виході в 1 установлені ті біти, ознаки для яких підтверджені.

Відкрийте допомогу для цієї функції і розгляньте ці ознаки!

Функція повертає TRUE, якщо текст по більшості ознак типу Unicode, FALSE для типу ANSI.

Функція для перетворення ANSI в Unicode MultiByteToWideChar :

int MultiByteToWideChar(

UINT CodePage,       // Кодова сторінка, звичайно задається CP_ACP

DWORD dwFlags,             // 0

LPCSTR lpMultiByteStr,   // Рядок, який перетворюється

int cbMultiByte,             // Розмір (в байтах)

LPWSTR lpWideCharStr, // Рядок - результат

int cchWideChar            // Розмір в wchar_t символах.

);

Функція повертає кількість символів в рядку-результату.

 

Функція для перетворення Unicode в ANSI

int WideCharToMultiByte(    

UINT CodePage,     // Кодова сторінка, звичайно задається CP_ACP

DWORD dwFlags,           // 0

LPCWSTR lpWideCharStr, // Рядок, який перетворюється

int cchWideChar,              // // Розмір

LPSTR lpMultiByteStr,   // Рядок - результат

int cbMultiByte,           // // Розмір

LPCSTR lpDefaultChar, // Адреса символу, яким заміняється

     //символ, що перетворюється, якщо він не може бути

     // відображений. Дорівнює NULL, якщо використовується

     // символ за  замовчуванням.

LPBOOL lpUsedDefaultChar // Покажчик на прапорець, який вказує на

     // те, чи використовувався символ за замовчуванням у

     // попередньому параметрі. Може бути NULL.

);

Функція повертає кількість символів в рядку, який є результатом.

 


Дата добавления: 2018-05-13; просмотров: 355; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!