Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
VOPROS_331.doc
Скачиваний:
20
Добавлен:
04.08.2019
Размер:
297.98 Кб
Скачать

Вопрос № 40

Символьного типа-сhr (N) - функция, возвращающая символ с кодом N в кодировке Windows.ChrUnicode(W) - возвращает символ с кодом W в кодировке Unicode; OrdUnicode(C) - возвращает значение типа word, представляющее собой код символа C в кодировке Unicode. char(W) возвращает символ с кодом W в кодировке Unicode; word(C) возвращает код символа C в кодировке Unicode. Строковые переменныеВ С отсутствуют встроенные строковые типы в том смысле, в котором они есть в языках типа Basic и Pascal. И присущая этим языкам легкость оперирования строковыми переменными (присвоение, сравнение) в С недоступна. Что же такое строка в С?Для начала разберемся, что такое строка в жизни. Очевидно, что строка – это последовательность символов. В С – как в жизни. С-строка — это последовательность символов. Как известно, последовательности в С представляются массивами или указателями. Между первыми и вторыми существует связь, однако природа этой связи выходит за рамки данной статьи. Предполагается, что читателю знакомы следующие особенности связи между массивами и указателями:массив можно привести к указателю на его первый элемент, что неявно происходит при передаче массивов в функции, ожидающие указателиинформация о размере массива переданного таким образом в функцию теряетсяв С не существует способа передать массив по значению с сохранением его размерауказателя на первый элемент массива достаточно для работы со всем массивом, при условии что нам известна его длина.Если вышеприведенные высказывания вызывают у вас затруднения, рекомендую сначала разобраться с этим вопросом, а уже потом читать эту статью.В дальнейшем для простоты я по большей части буду говорить о массивах, но почти все сказанное относится и к указателям.Итак, тип строк в С – массив. Однако каков тип элементов этого массива? Вообще говоря, возможны варианты. Исторически символ занимает 1 байт, в этом случае он имеет тип char. При этом существуют и другие кодировки, в которых символ представляется, например, двумя байтами. Для работы с такими строками требуются специальные функции.Слегка отвлечемся от строк и разберем понятие кодировки. По определению, кодировка - это способ представления чего либо, в нашем случае символов. Кодировки символов делятся на однобайтные - каждый символ представлен одним байтом и многобайтные, в которых одному символу соответствует несколько байтов. В свою очередь многобайтные кодировки можно разделить на кодировки с фиксированным количеством байтов - каждому символу соответствует одинаковое количество байтов, и «плавающие», в которых один символ может представляться разным количеством байтов в зависимости от его содержимого. К первым относятся кодировки типа Unicode, в которой каждый символ представлен двумя байтами, ко вторым - UTF-8 и др. Плавающие кодировки - отдельная тема, языки С/С++ не предлагают для них никакой поддержки.Необходимость в многобайтных кодировках возникла из-за того, что одним стандартным байтом можно представить не так много символов, например восьмибитный байт способен принимать значения от 0 до 255, а значит в такой кодировке не может существовать более 256 различных символов. Учитывая, что, например, в японском языке около двух тысяч иероглифов, 256 символов японцам явно не хватит. Но уже двух восьмибитных байтов хватит для представления 65536 символов - вполне неплохо, хотя и недостаточно для представления всех символов на свете. Между однобайтными и фиксированными многобайтными строками принципиальной разницы нет. В С/С++ существует специальный тип для многобайтных символов - wchar_t и специальные функции для работы со строками, состоящими из таких символов. Размер wchar_t не фиксирован в стандарте и определяется реализацией компилятора. На многих платформах и компиляторах это два байта, соответствующих кодировке Unicode. Каждой функции, работающей со строками из однобайтных символов, соответствует функция - «побратим», принимающая строки из многобайтных символов. Кроме того, существует специальная форма для записи строковых литералов, в которых символы представлены несколькими байтами: перед кавычками ставится буква L. Т.е., возвращаясь к нашему первому примеру, вызов функции SetWindowText в Unicode-программе будет выглядеть так:SetWindowText(hwnd, L"Новый заголовок окна");

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]