![]() |
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]() ![]() ![]() |
|
Emura |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 102 Регистрация: 7.2.2009 Репутация: 1 Всего: 1 |
Возникли непонятки с использованием unicode и как следствие c utf. по поиску в темах одни куски информации. более полного и внятного изложения не нашел. есть желание разобраться в вопросе. первый пост планирую дополнять полученной информацией.
для начала 1.
2. в настройках проекта "Character Set" сменить на "Use Unicode Character Set" 3. строки в коде обрамлять макросом _T("строка") Текущие вопросы: -какой тип данных для строк использовать предпочтительней? (TCHAR, std::wstring или другое ) а главное удобнее -можно ли использовать TEXT("строка") ? Это сообщение отредактировал(а) Emura - 23.4.2009, 00:42 |
|||
|
||||
GremlinProg |
|
||||||||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
так лучше не делать, это просто делает невозможным смену типа проекта из его настроек (можно назвать этот способ "в лоб")
идеальный способ этот макрос нужно использовать повсюду, на что распространяется влияние пункта 2,, т.е. независимо от того, UNICODE приложение или ANSI
проще всего пользоваться одним видом трансляции: и глазу приятно и мозг не перегружен из постоянных - это макрос _T(x) и тип данных _TCHAR все транслируемые CRT-функции имеют так же префикс _t, который переводит их в 2 группы с префиксами mbs и wcs, что соответственно означает multi byte string(байтовые строки char) и wide char string(широкосимвольные строки wchar_t) конечно можно два макроса: _T(x) и TEXT(x) - идентичны разница между ними только в том, что первый включен в tchar.h, а второй - в WinNT.h, что соответственно, и определяет, какой из них доступен в данный момент (если подключается и windows.h и tchar.h, то ограничений нет - пользуй что хочешь) Добавлено через 5 минут и 30 секунд
в принципе, _T можно и не использовать, но тогда по-хорошему, чтобы не было проблем, нужно настраивать кодировку проекта, используя лобовой метод (пункт 1) тогда, чтобы не было проблем, этот метод нужно расширить: установка ANSI:
установка UNICODE:
-------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
||||||||||
|
|||||||||||
Emura |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 102 Регистрация: 7.2.2009 Репутация: 1 Всего: 1 |
спасибо за уточнения!
тогда от способа в лоб отказываемся тк он лишний, указываем Character Set через настройки проекта. и в коде используем _T("строка")
_TCHAR и TCHAR в чем суть префикса "_" ? ![]() чтобы быстрее разобраться буду стараться задавать конкретные вопросы ![]() планирую: 1) использовать UTF в самописных компонентах (принимать при вводе, для локализации и тп). 2) сохранять UTF в файл и читать от туда, запись осуществлять по-байтово. ps. читаю попутно ФАКи Это сообщение отредактировал(а) Emura - 23.4.2009, 02:41 |
|||
|
||||
GremlinProg |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
суть все в том же: _TCHAR объявлен в tchar.h, а CHAR - в WinNT.h _ - для разделения типов, поскольку typedef уже генерирует новый тип, т.е. чтобы не было неоднозначности при подключении обоих файлов в один проект; оба идентично определяют транслируемый тип данных char и wchar_t правило в принципе очевидно: все, что с префиксом _ - из tchar.h все, что без него - из WinNT.h это так же касается и использования самих макосов трансляции: UNICODE и _UNICODE Добавлено через 11 минут и 50 секунд иногда приложение требуется писать только в одной кодировке, причины могут быть разные: отсутствие поддержки какого-нибудь API UNICODE, или наоборот - ANSI, проблемы с русскими кодировками, и т.п., поэтому, чтобы не вводить в заблуждение остальных участников проекта, следует этот момент четко зафиксировать в коде, в таком случае и требуется метод "в лоб", т.е. он не лишний, просто требуется он крайне редко и не по делу его использовать не стоит, только когда реально невозможно поддержать в проекте обе ветки Добавлено через 13 минут и 7 секунд этот метод можно просто переместить в самый конец, как "случай на крайний случай" ) -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
GremlinProg |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
для std::string и std::wstring нет транслятора, поэтому, при их использовании следует написать транслятор, например такой:
и, соответственно, использовать std::_tstring либо аналогично объявить typedef для _tstring либо использовать их применительно к частным случаям: в функциях с префиксами mbs и wcs, или с постфиксом A и W в API, соответственно -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
Emura |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 102 Регистрация: 7.2.2009 Репутация: 1 Всего: 1 |
GremlinProg, спасибо, с _t уяснил.
1) std::wstring и WCHAR - в чем существенные отличия и что использовать удобнее? 2) в каких случаях может потребоваться конвертировать WCHAR в multi byte? 3) в каких случаях может потребоваться работа с LPTSTR ? 4) как определить длину для TCHAR ? (lstrlen ?) подозреваю что нужна функция с префиксом _t (но не нашел)
GremlinProg, направь пожалуйста - какая должна быть последовательность(логика) действий для данной задачи. Это сообщение отредактировал(а) Emura - 23.4.2009, 14:38 |
|||
|
||||
GremlinProg |
|
||||||||||||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
http://forum.vingrad.ru/index.php?showtopi...t&p=1832431 тут одновременная поддержка 4-х кодировок, одна из которых - ANSI, остальные двухбайтовые чтение осуществляется посимвольно (исходя из установок _UNICODE) побайтово это делать не нужно смотри пример по крайней мере, чтение шаблона должно быть понятно можно конечно выделить:
_tcslen строковые CRT-функции все здесь: http://msdn.microsoft.com/en-us/library/f0151s4x(VS.80).aspx к любой функции в MSDN есть табличка Generic-Text Routine Mappings, в ней как раз все алиасы для нее и определены пример таблицы:
LPTSTR - это ни что иное как _TCHAR*, соответственно, и требуется он так же, при трансляции _UNICODE
в случаях, когда нужна байтовая строка: char*, а имеется WCHAR*
сравнивать их нет смысла std::wstring - строковый буфер единственное, что у них общего - тип символа WCHAR Добавлено через 12 минут и 57 секунд если поддержка ANSI-файлов не предполагается, то можно работать и так:
-------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
||||||||||||||
|
|||||||||||||||
Emura |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 102 Регистрация: 7.2.2009 Репутация: 1 Всего: 1 |
GremlinProg, большое спасибо за разъяснения. буду разбираться.
|
|||
|
||||
GremlinProg |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
незачто, у тебя правильный подход к систематизации знаний,
и правильные вопросы за это тебе +1
удобнее использовать конечно STL-контейнеры, в данном случае std::wstring, std::string -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
Emura |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 102 Регистрация: 7.2.2009 Репутация: 1 Всего: 1 |
спасибо! скоро правильных вопросов по кодировке будет еще больше ![]() пс. я с c# перешел на с++ (на c# с php ![]() ![]() Это сообщение отредактировал(а) Emura - 24.4.2009, 15:15 |
|||
|
||||
Emura |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 102 Регистрация: 7.2.2009 Репутация: 1 Всего: 1 |
вот понадобилось сравнить две строки и задумался что использовать
s1 и s2 могут быть как std::string так и std::wstring. на данный момент ориентируюсь на wstring. может для пущей точности использовать и то и то? что посоветуете? Это сообщение отредактировал(а) Emura - 28.4.2009, 13:08 |
|||
|
||||
GremlinProg |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
без разницы, обе функции делают одно и то же
разница может быть только если локаль потока отличается от локали CRT: первая функция использует локаль CRT: setlocale вторая функция использует локаль потока, в котором она вызывается: GetThreadLocale (хотя локаль CRT может сама синхронизироваться с локалью потока, не проверял, но в таком случае, результаты работы обеих функций будут уже абсолютно идентичны) для большей гарантии в работоспособности, лучше использовать что-то одно, не надо смешивать Добавлено через 2 минуты и 38 секунд
не надо смешивать так же _t-функции с wcs-данными, и наоборот Добавлено через 3 минуты и 29 секунд с wcs- и mbs-данными -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
Emura |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 102 Регистрация: 7.2.2009 Репутация: 1 Всего: 1 |
ок, спасибо за совет.
GremlinProg, не понял замечания, ведь _tcscmp расширяется в strcmp и в wcscmp. а если это про то, что wstring строковый буфер это я усвоил ![]() |
|||
|
||||
GremlinProg |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
я про то, что явное использование std::wstring и std::string уже не желательно с функциями _t правильно, еси они используются неявно, т.е. через транслятор: http://forum.vingrad.ru/index.php?showtopi...t&p=1850432 -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
Emura |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 102 Регистрация: 7.2.2009 Репутация: 1 Всего: 1 |
GremlinProg, да да да, именно этой политике я и придерживаюсь
![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Системное программирование и WinAPI" | |
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |