![]() |
|
Модераторы: 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 ) -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| vns955 |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 172 Регистрация: 21.11.2006 Репутация: нет Всего: нет |
Не работает :(. А Вы так делали и работало?
|
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
нет, не пробовал,
просто это единственная функция в API, которая позволяет сменить языковые стандарты в текщем потоке как еще один вариант - поэкспериментировать с CharToOem, совместно с SetThreadLocale не очень удобно, но надо хотя бы один рабочий вариант иметь (и мне кажется, тут локаль CRT желательно вообще не использовать, т.е. без setlocale, только API, чтобы не мешали они друг-другу) Добавлено через 1 минуту и 29 секунд по крайней мере до получения каких-либо вменяемых результатов -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
![]()
|
| Правила форума "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. |