информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Портрет посетителяСтрашный баг в WindowsВсе любят мед
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Бэкдор в xz/liblzma, предназначенный... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
все доски
FAQ
IRC
новые сообщения
site updates
guestbook
beginners
sysadmin
programming
operating systems
theory
web building
software
hardware
networking
law
hacking
gadgets
job
dnet
humor
miscellaneous
scrap
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
[C++] Уточняю - на сколько я протормозил ;))) 26.04.04 22:04  Число просмотров: 940
Автор: void <Grebnev Valery> Статус: Elderman
<"чистая" ссылка> <обсуждение закрыто>
> DrawText (hdc, _T("Привет") , -1,
> Я так понимаю вопросы здесь?
> _T() это макрос из tchar.c, который в зависимости от
> наличия макроса _UNICODE (именно с подчеркиванием) делает
> или L"Привет" или просто "Привет".

Это понятно. Было не понятно, как копилер в зависимости от региональных настроек ОС компилит строку? Что он при этом делает? Как определяет кодовую страничку для преобразования? См. ниже.

> > Кто выполняет эти преобразования?
> Компилятор. Стандарт языка C++ предусматривает два вида
> строковых литералов: "string" - обычная ASCII-строка и
> L"string" - Unicode-строка (аналогично 'c' и L'c')

Как ты считаешь, что находится в строках с-кода (т.е. в тексте), когда мы редактируем файл в
IDE MS VS? Я просто не проверял.
А если я, к примеру, японец, и пишу японскую программу на японском компьютере (пользуясь IDE MS VS), где в тексте программы создаю японское привет _T(" здесь пишу иероглифами ")? Ты думаешь, что там будет строка с однобайтными символами?

> > Что происходит с памятью, выделенной для строки?
> Ничего она просто попадает в data-секцию в готовом к
> употреблению виду.

Я имел ввиду не то, где она будет расположена, а то, насколько корректно компиллер сможет определить требуемое число байт, если он корректно распознаёт символы UNICODE на стадии компиляции.
В частности, меня смутили заявления MS, что желательно строки в ресурсах делать длиннее требуемых на 30 % (наверное, заполнять пробелами ?). Я не понимаю, зачем это необходимо делать.
И надо ли на самом деле?

> Если я неправильно понял суть вопроса - скажи

Суть вопроса была в том, что я не понимал, откуда компилер берёт информацию для преобразования строки _T("Привет") в соответствии с русской кодировкой? При этом предполагалось, что мы не используем преобразование в явном виде при помощи MultiByteToWideChar, а компилер должен сам догадаться каким-то образом, что русские символы следует конверировать в русскую кодировку UNICODE.
По тому, что нормальность, или не нормальность перекодировки зависит от региональных настроек ОС - можно было догадаться, что если компилеру не указывать ничего о кодировке, то будет использованы установки по-умолчанию ОС. Меня смущала эта неопределённость, в некотором смысле.

Парни с одного из российских форумов только-только мне подсказали, мол для очистки совести попробуй
#pragma setlocale(.....) ;)))

Я попробовал и понял, какой я идиот. ;))) Нет, чтоб покопать самому в директивах компиллера ;))) Теперь мне стыдно ;)))
Это меня удовлетворило. Теперь понятно, что неопределённости нет. Либо компиллер будет использовать настройки ОС ( если ему ничего не подсказывать про кодировку, например, русскую ), либо можно явно указывать, что на стадии компиляции все строки должны быть преобразованы в UNICODE стоки с русскими символами, если мы используем #pragma setlocale(.....)
Теперь я рад, что хоть и в надуманном примере, но процесс управляемый ;))))

Теперь дополнительные вопросы:

1) Почему в stdafx.h проекта требуется одновременные декларации
#define UNICODE
#define _UNICODE

Только одного из символов недостаточно. Появляются ошибки компиллера. Проект - чисто winapi.

2) Почему #pragma setlocale ни как не отражается на строках в ресурсах. Там важно другое - в какой секции расположены строковые ресурсы или строки элементов управления.
<programming> Поиск 






Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach