Re[3]: ЮНИКОД «за спиной»
От: c-smile Канада http://terrainformatica.com
Дата: 25.04.04 02:17
Оценка: +1
Здравствуйте, vg_123, Вы писали:

_>ПС. Наверное в этом дело. Если я не прав — поправьте, плз.


Скомпилируй и открой exe/dll c пом. двоичного редактора. Все увидишь сам.
Re[3]: ЮНИКОД «за спиной»
От: SchweinDeBurg Россия https://zarezky.spb.ru/
Дата: 25.04.04 06:33
Оценка: +1
Здравствуйте, vg_123, Вы писали:

_>Здравствуйте, Reyst, Вы писали:


R>>Здравствуйте, vg_123, Вы писали:


_>>>В коде ниже UNICODE-проекта не делается преобразования строки при помощи MuliByteToWideChar. При копиляции в VC++ 7.0, при дефолтовых региональных настройках Russian XP (eng.) – имеем нормальные русские символы:



_>>>
_>>>            DrawText (hdc, _T("Привет") , -1, &Rect,
_>>>


_>>>Как такое возможно? Кто выполняет эти преобразования? Что происходит с памятью, выделенной для строки?


R>>Строка константная, "в товарный вид" приводится во время компиляции.

R>>Пять минут назад был топик про макрос _T(), который этим и занимается.

_>_T — говорит о том, что это "широкая", L строка при #define UNICODE.

_>Сам он не занимается конвертацией симоволов строки из MBCS в UNICODE.
_>Есть подозрение, что IDE VC++, редактор С++ кода используют MBCS.
_>Пост был про то, что при региональных настройках OS — Russian это позволяет компилиру
_>правильно создать строку UNICODE. Если бы региональные настройки были б English,
_>то вместо русского "Привет" мы б увидели закорюки.

_>ПС. Наверное в этом дело. Если я не прав — поправьте, плз.


Для полной очистки совести можно еще посмотреть в сторону #pragma setlocale.
[ posted via RSDN@Home 1.1.2 stable ]
- Искренне ваш, Поросенок Пафнутий
ЮНИКОД «за спиной»
От: vg_123  
Дата: 24.04.04 15:57
Оценка:
Подскажите, пожалуйста.
В коде ниже UNICODE-проекта не делается преобразования строки при помощи MuliByteToWideChar. При копиляции в VC++ 7.0, при дефолтовых региональных настройках Russian XP (eng.) – имеем нормальные русские символы:


LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
…
    switch (message) {
    case WM_PAINT:
        hdc = BeginPaint(hWnd, &ps);
            GetClientRect(hWnd,&Rect);
            DrawText (hdc, _T("Привет") , -1, &Rect,
            DT_SINGLELINE | DT_CENTER | DT_VCENTER); 
        EndPaint(hWnd, &ps);
        break;
…
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}



Вопросы:
Как такое возможно? Кто выполняет эти преобразования? Что происходит с памятью, выделенной для строки?

Спасибо.


26.04.04 22:19: Перенесено модератором из 'C/C++' — WH
Re: ЮНИКОД «за спиной»
От: Reyst Россия  
Дата: 24.04.04 16:11
Оценка:
Здравствуйте, vg_123, Вы писали:

_>В коде ниже UNICODE-проекта не делается преобразования строки при помощи MuliByteToWideChar. При копиляции в VC++ 7.0, при дефолтовых региональных настройках Russian XP (eng.) – имеем нормальные русские символы:



_>
_>            DrawText (hdc, _T("Привет") , -1, &Rect,
_>


_>Как такое возможно? Кто выполняет эти преобразования? Что происходит с памятью, выделенной для строки?


Строка константная, "в товарный вид" приводится во время компиляции.
Пять минут назад был топик про макрос _T(), который этим и занимается.
Все, что здесь сказано, может и будет использоваться против меня...
Re: ЮНИКОД «за спиной»
От: igorvorobiev Россия  
Дата: 24.04.04 16:14
Оценка:
Здравствуйте, vg_123, Вы писали:

_>Подскажите, пожалуйста.

_>В коде ниже UNICODE-проекта не делается преобразования строки при помощи MuliByteToWideChar. При копиляции в VC++ 7.0, при дефолтовых региональных настройках Russian XP (eng.) – имеем нормальные русские символы:


_>
_>            DrawText (hdc, _T("Привет") , -1, &Rect,
_>            DT_SINGLELINE | DT_CENTER | DT_VCENTER); 
_>



_>Вопросы:

_>Как такое возможно? Кто выполняет эти преобразования? Что происходит с памятью, выделенной для строки?

Макрос _T, а память выделена компилятором как глобальная — статическая переменная.
Re[2]: ЮНИКОД «за спиной»
От: vg_123  
Дата: 25.04.04 00:48
Оценка:
Здравствуйте, Reyst, Вы писали:

R>Здравствуйте, vg_123, Вы писали:


_>>В коде ниже UNICODE-проекта не делается преобразования строки при помощи MuliByteToWideChar. При копиляции в VC++ 7.0, при дефолтовых региональных настройках Russian XP (eng.) – имеем нормальные русские символы:



_>>
_>>            DrawText (hdc, _T("Привет") , -1, &Rect,
_>>


_>>Как такое возможно? Кто выполняет эти преобразования? Что происходит с памятью, выделенной для строки?


R>Строка константная, "в товарный вид" приводится во время компиляции.

R>Пять минут назад был топик про макрос _T(), который этим и занимается.

_T — говорит о том, что это "широкая", L строка при #define UNICODE.
Сам он не занимается конвертацией симоволов строки из MBCS в UNICODE.
Есть подозрение, что IDE VC++, редактор С++ кода используют MBCS.
Пост был про то, что при региональных настройках OS — Russian это позволяет компилиру
правильно создать строку UNICODE. Если бы региональные настройки были б English,
то вместо русского "Привет" мы б увидели закорюки.

ПС. Наверное в этом дело. Если я не прав — поправьте, плз.
Re[4]: ЮНИКОД «за спиной»
От: Блудов Павел Россия  
Дата: 26.04.04 01:32
Оценка:
Здравствуйте, SchweinDeBurg, Вы писали:

SDB>Для полной очистки совести можно еще посмотреть в сторону #pragma setlocale.


А можно и в ресурсы вынести. Строкам в ресурсах можно явно locale задавать.
Re[3]: ЮНИКОД «за спиной»
От: Евгений Коробко  
Дата: 26.04.04 09:55
Оценка:
По-моему, региональные настройки не при чём. Строка в самом exe файла хранится в юникоде, поэтому при компиляции никаких преобразований не происходит. При запуске и обращении к DrawText WIN API пытается подобрать шрифт для нужного языка, и если получается, то всё ОК.
Posted via RSDN NNTP Server 1.8
Евгений Коробко
Re[4]: ЮНИКОД «за спиной»
От: MShura  
Дата: 26.04.04 12:12
Оценка:
Здравствуйте, Евгений Коробко, Вы писали:

ЕК>По-моему, региональные настройки не при чём. Строка в самом exe файла хранится в юникоде, поэтому при компиляции никаких преобразований не происходит. При запуске и обращении к DrawText WIN API пытается подобрать шрифт для нужного языка, и если получается, то всё ОК.


В исходном тексте каждая буковка — один байт, в exe получится два байта. Поэтому компилятор вызывает преобразование строки при компиляции.
Представь, что в одном исходнике ты пишешь строки на русском и на немецком.
Что будет в exe, если компилятор будет одинаково преобразовывать однобайтовые к двубайтовым строкам?
Тут ему нужна подсказка.
Если подсказок не будет, то компилятор, наверное, использует региональные настройки.
В этом случае один текст (или оба) будут неправильными.
Re[5]: ЮНИКОД «за спиной»
От: vg_123  
Дата: 26.04.04 16:57
Оценка:
Здравствуйте, Блудов Павел, Вы писали:

БП>Здравствуйте, SchweinDeBurg, Вы писали:


SDB>>Для полной очистки совести можно еще посмотреть в сторону #pragma setlocale.


БП>А можно и в ресурсы вынести. Строкам в ресурсах можно явно locale задавать.


Не всегда помещение строк в русской секции даст желаемый результат (для проектов MFC)
Re[4]: ЮНИКОД «за спиной»
От: vg_123  
Дата: 26.04.04 17:00
Оценка:
Здравствуйте, Евгений Коробко, Вы писали:

ЕК>По-моему, региональные настройки не при чём. Строка в самом exe файла хранится в юникоде, поэтому при компиляции никаких преобразований не происходит. При запуске и обращении к DrawText WIN API пытается подобрать шрифт для нужного языка, и если получается, то всё ОК.


Ошибаешься. При чём. Парни правильно мне пропостили.
Ты путаешь то, что в исполняемом коде будет широкая строка с тем, при каких обстоятельятсвах там будет то, что ты хочешь увидеть.
Re[5]: ЮНИКОД «за спиной»
От: vg_123  
Дата: 26.04.04 17:05
Оценка:
Здравствуйте, MShura, Вы писали:

MS>Здравствуйте, Евгений Коробко, Вы писали:


ЕК>>По-моему, региональные настройки не при чём. Строка в самом exe файла хранится в юникоде, поэтому при компиляции никаких преобразований не происходит. При запуске и обращении к DrawText WIN API пытается подобрать шрифт для нужного языка, и если получается, то всё ОК.


MS>В исходном тексте каждая буковка — один байт, в exe получится два байта. Поэтому компилятор вызывает преобразование строки при компиляции.

MS>Представь, что в одном исходнике ты пишешь строки на русском и на немецком.
MS>Что будет в exe, если компилятор будет одинаково преобразовывать однобайтовые к двубайтовым строкам?
MS>Тут ему нужна подсказка.
MS>Если подсказок не будет, то компилятор, наверное, использует региональные настройки.
MS>В этом случае один текст (или оба) будут неправильными.

>>> В исходном тексте каждая буковка — один байт

Есть уверенность, что именно один байт? Краем уха слышал, что IDE VS использует MBCS. Сам не проверял.
Re[4]: ЮНИКОД «за НЕ спиной» - в точку !!!!
От: vg_123  
Дата: 26.04.04 17:09
Оценка:
Здравствуйте, SchweinDeBurg, Вы писали:


SDB>Для полной очистки совести можно еще посмотреть в сторону #pragma setlocale.


Спасибо. Наверное, я просто настолько туп, чтоб самому догадаться.

Конечно, Вы правы абсолютно. #pragma setlocale
Всё просто
Re[6]: ЮНИКОД «за спиной»
От: _nn_  
Дата: 26.04.04 17:24
Оценка:
Здравствуйте, vg_123, Вы писали:

_>Здравствуйте, MShura, Вы писали:


MS>>Здравствуйте, Евгений Коробко, Вы писали:


ЕК>>>По-моему, региональные настройки не при чём. Строка в самом exe файла хранится в юникоде, поэтому при компиляции никаких преобразований не происходит. При запуске и обращении к DrawText WIN API пытается подобрать шрифт для нужного языка, и если получается, то всё ОК.


MS>>В исходном тексте каждая буковка — один байт, в exe получится два байта. Поэтому компилятор вызывает преобразование строки при компиляции.

MS>>Представь, что в одном исходнике ты пишешь строки на русском и на немецком.
MS>>Что будет в exe, если компилятор будет одинаково преобразовывать однобайтовые к двубайтовым строкам?
MS>>Тут ему нужна подсказка.
MS>>Если подсказок не будет, то компилятор, наверное, использует региональные настройки.
MS>>В этом случае один текст (или оба) будут неправильными.

>>>> В исходном тексте каждая буковка — один байт

_>Есть уверенность, что именно один байт? Краем уха слышал, что IDE VS использует MBCS. Сам не проверял.
См. здесь
Автор(ы): Гулай Борис aka BoresExpress
Многие разработчики мечтают о всемирной популярности своих приложений, но почти никто не создает локализованных версий своих приложений, ошибочно полагая, что программа должна сначала завоевать популярность.

Поясню принцип работы этой функции: строки хранятся в ресурсах (в кодировке Unicode) группами по 16 штук, и минимальная загружаемая единица – это группа строк. Каждая группа имеет свой идентификатор, который равен идентификатору первой строки в группе плюс 1. После того, как мы загрузили нужную группу строк, мы ищем (последовательным перебором) нужную строку в группе. Строки внутри группы хранятся следующим образом:

Длина строки Текст строки Длина строки Текст строки
2 байта (длина строки)*2 байт 2 байта (длина строки)*2 байт

http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[6]: ЮНИКОД «за спиной»
От: Reyst Россия  
Дата: 26.04.04 17:59
Оценка:
Здравствуйте, vg_123, Вы писали:

_>Есть уверенность, что именно один байт? Краем уха слышал, что IDE VS использует MBCS. Сам не проверял.


Здесь не надо слышать "краем уха". А надо посмотреть на команду меню "Save As..." — "Save with encoding" и убедиться, что сохранение файла возможно в любой кодировке, доступной системе, включая различные варианты Unicod'а.

По умолчанию используется дефолтная кодировка операционной системы, т.е. в обсуждаемом случае Cyrillic (Windows) — Codepage 1251, но если вас это не устраивает, ничто не мешает заменить формат хранения хоть на DOS 866, хоть на Unicod.

А вот как компилятор ИНТЕРПРЕТИРУЕТ исходный файл, если он в MBCS/SBSC — это, как уже сказано, отвечает #pragma setlocale
Все, что здесь сказано, может и будет использоваться против меня...
Re[7]: ЮНИКОД «за спиной»
От: vg_123  
Дата: 27.04.04 01:50
Оценка:
Здравствуйте, _nn_, Вы писали:

__>Здравствуйте, vg_123, Вы писали:


_>>Здравствуйте, MShura, Вы писали:


MS>>>Здравствуйте, Евгений Коробко, Вы писали:


ЕК>>>>По-моему, региональные настройки не при чём. Строка в самом exe файла хранится в юникоде, поэтому при компиляции никаких преобразований не происходит. При запуске и обращении к DrawText WIN API пытается подобрать шрифт для нужного языка, и если получается, то всё ОК.


MS>>>В исходном тексте каждая буковка — один байт, в exe получится два байта. Поэтому компилятор вызывает преобразование строки при компиляции.

MS>>>Представь, что в одном исходнике ты пишешь строки на русском и на немецком.
MS>>>Что будет в exe, если компилятор будет одинаково преобразовывать однобайтовые к двубайтовым строкам?
MS>>>Тут ему нужна подсказка.
MS>>>Если подсказок не будет, то компилятор, наверное, использует региональные настройки.
MS>>>В этом случае один текст (или оба) будут неправильными.

>>>>> В исходном тексте каждая буковка — один байт

_>>Есть уверенность, что именно один байт? Краем уха слышал, что IDE VS использует MBCS. Сам не проверял.
__>См. здесь
Автор(ы): Гулай Борис aka BoresExpress
Многие разработчики мечтают о всемирной популярности своих приложений, но почти никто не создает локализованных версий своих приложений, ошибочно полагая, что программа должна сначала завоевать популярность.

__>

__>Поясню принцип работы этой функции: строки хранятся в ресурсах (в кодировке Unicode) группами по 16 штук, и минимальная загружаемая единица – это группа строк. Каждая группа имеет свой идентификатор, который равен идентификатору первой строки в группе плюс 1. После того, как мы загрузили нужную группу строк, мы ищем (последовательным перебором) нужную строку в группе. Строки внутри группы хранятся следующим образом:

__>Длина строки Текст строки Длина строки Текст строки
__>2 байта (длина строки)*2 байт 2 байта (длина строки)*2 байт


Thanks a lot, man!
Re[7]: ЮНИКОД «за спиной»
От: vg_123  
Дата: 27.04.04 01:52
Оценка:
Здравствуйте, Reyst, Вы писали:

R>Здравствуйте, vg_123, Вы писали:


_>>Есть уверенность, что именно один байт? Краем уха слышал, что IDE VS использует MBCS. Сам не проверял.


R>Здесь не надо слышать "краем уха". А надо посмотреть на команду меню "Save As..." — "Save with encoding" и убедиться, что сохранение файла возможно в любой кодировке, доступной системе, включая различные варианты Unicod'а.


R>По умолчанию используется дефолтная кодировка операционной системы, т.е. в обсуждаемом случае Cyrillic (Windows) — Codepage 1251, но если вас это не устраивает, ничто не мешает заменить формат хранения хоть на DOS 866, хоть на Unicod.


R>А вот как компилятор ИНТЕРПРЕТИРУЕТ исходный файл, если он в MBCS/SBSC — это, как уже сказано, отвечает #pragma setlocale


Спасибо. Все вопросы от моего невежества.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.