информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Все любят медГде водятся OGRыСтрашный баг в Windows
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Три миллиона электронных замков... 
 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
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
так как у тебя #define _unicode, то _т("привет") уже unicode... 27.04.04 00:00  Число просмотров: 1021
Автор: + <Mikhail> Статус: 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(.....)
> Теперь я рад, что хоть и в надуманном примере, но процесс
> управляемый ;))))

так как у тебя #define _UNICODE, то _Т("Привет") уже UNICODE и ни о каких преобразованиях и речи быть не должно.
другое дело если у тебя _MBCS или SBCS

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

UNICODE - используются в "windows headers"
_UNICODE - используются в "C-runtime/MFC headers"

>
> Только одного из символов недостаточно. Появляются ошибки
должно быть достаточно одного какого-либо define, другой define автоматически

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

наверно надо #pragma setlocale в ресурсе тоже(это для _MBCS или SBCS?). вообще ни когда не имел проблем если исползовать UNICODE, windows то UNICODE-ная.

> строковые ресурсы или строки элементов управления.
<programming> Поиск 






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


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