![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| vns955 |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 172 Регистрация: 21.11.2006 Репутация: нет Всего: нет |
Всем зрям!
Мне нужно определить текущую кодовую страницу и передать ее в setlocale(). Т.е чтоб такой код работал:
Это для руского языка, но если у меня например текущей будет немецкая кодовая то она должна как-то определиться из системы и быть передана в ф-ции setlocale() и imbue() и вывод на немецком должен корректно отображаться в консольном приложении. Вопрос: как правильно определить кодовую страницу которую надо подставить в упомянутые ф-ции? Использование ф-ций GetConsoleCP(), GetACP() и GetOEMCP() не увелчалось успехом. :( Использую VS2003, стоит в настройках: Unicode character Set, (/Zc:wchar_t), (/Zc:forScope) в Language. Спасибо |
|||
|
||||
| 586 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2243 Регистрация: 8.5.2006 Репутация: 39 Всего: 146 |
|
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
GetSystemDefaultLCID дает локаль принятую в системе
GetUserDefaultLCID дает локаль принятую для текущего пользователя GetLocaleInfoEx - это общий метод, позволяющий извлекать разные данные локали по ее идентификатору, например: язык, страна, страница OEM, ACP и т.п. GetSystemDefaultLocaleName GetUserDefaultLocaleName - тут все аналогично с первыми двумя, только вместо локали возвращается ее имя (частный случай функции GetLocaleInfo) -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| vns955 |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 172 Регистрация: 21.11.2006 Репутация: нет Всего: нет |
Пробовал подставлять то что возвращают ф-ции GetSystemDefaultLCID() и GetUserDefaultLCID() - не получилось :(
|
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
это поставлять в setlocale и не нужно, но можно подставлять строковые: GetSystemDefaultLocaleName, GetUserDefaultLocaleName, а GetSystemDefaultLCID() и GetUserDefaultLCID() можно подставлять в GetLocaleInfoEx, чтобы извлечь информацию если нужна кодовая страница, как в примере, типа setlocale(LC_ALL, ".866"), то для этого есть несколько флагов к GetLocaleInfoEx: LOCALE_IDEFAULTANSICODEPAGE - это флаг для получения ANSI-кодировки для заданной локали LOCALE_IDEFAULTCODEPAGE - это флаг для получения OEM-кодировки для заданной локали только из GetLocaleInfoEx при этом вернется просто номер страницы, без точки, так что тут перед подстановкой в setlocale надо дополнительно формировать строку из этого номера (не помню только в бинарном виде или в строковом) либо использовать просто флаг LOCALE_SENGLANGUAGE - язык локали по английски, т.е. соответственно: для GetSystemDefaultLCID - язык, принятый в системе для GetUserDefaultLCID - язык, принятый для пользователя Добавлено через 14 минут и 39 секунд по идее, можно и так и так, есть флаг LOCALE_RETURN_NUMBER, правда я не нашел его в онлайн документации -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
а, все понял, смотрел в CE, вот верная ссылка: http://msdn.microsoft.com/en-us/library/dd464799(VS.85).aspx
-------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| vns955 |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 172 Регистрация: 21.11.2006 Репутация: нет Всего: нет |
GetLocaleInfoEx() поддерживает минимум Windows Server 2008, а я программирую под Server 2003. Можно ли обойтись без этой ф-ции?
|
|||
|
||||
| GremlinProg |
|
||||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
вообще-то она даже в XP присутствует, я ее использовал без проблем, но если есть сомнения, используй просто GetLocaleInfo
в онлайне:
Добавлено через 2 минуты и 38 секунд а, нет, перепутал все верно - доступна только GetLocaleInfo -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
||||||||
|
|||||||||
| vns955 |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 172 Регистрация: 21.11.2006 Репутация: нет Всего: нет |
Ну я пробовал использовать GetLocaleInfo() с флагом LOCALE_IDEFAULTCODEPAGE, она вернула 850. Я это значение подставил в setlocale() только с точкой т.е ".850" и то же самое :(. Мне кажется что не этом дело - пробовал я различные значения, нужно наверное копать в другую сторону.
|
|||
|
||||
| GremlinProg |
|
||||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
как так-то?
-------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
||||||||
|
|||||||||
| GremlinProg |
|
||||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
уэльский:
чешский:
-------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
||||||||
|
|||||||||
| vns955 |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 172 Регистрация: 21.11.2006 Репутация: нет Всего: нет |
Ну да, именно так если использовать такие ф-ции как у Вас, но я юзал GetSystemDefaultLCID() для затравки, поэтому получил другие значения, но это ничего не меняет - все равно не выводит правильно :(
|
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
с GetSystemDefaultLCID аналогично (у меня они равны)
vns955, я так полагаю, у тебя просто операционка на русскую локаль не настроена (смотри панель управления, язык и рег. стандарты и т.д.) -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| vns955 |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 172 Регистрация: 21.11.2006 Репутация: нет Всего: нет |
Проблема не в том чтоб русские символы выводить а чтоб правильно выводить другие, вот такой код неправильно выводит немецкие символы:
Немецкий в системе установлен, установлено чтоб использавать этот язык для не юникод символов. Far и Total Commander корректно отображает немецкие папки - русские нет, а если я установлю по-умолчанию русский - будет наоборот. Так вот мне надо чтоб моя прога работала так же :( |
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
перед setlocale попробуй поставить SetThreadLocale( lcid ) -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
![]()
|
| Правила форума "C/C++: Системное программирование и WinAPI" | |
|
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |