| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Системное программирование и WinAPI > Как правильно определить кодовую страницу |
| Автор: vns955 1.6.2009, 19:33 | ||
| Всем зрям! Мне нужно определить текущую кодовую страницу и передать ее в setlocale(). Т.е чтоб такой код работал:
Это для руского языка, но если у меня например текущей будет немецкая кодовая то она должна как-то определиться из системы и быть передана в ф-ции setlocale() и imbue() и вывод на немецком должен корректно отображаться в консольном приложении. Вопрос: как правильно определить кодовую страницу которую надо подставить в упомянутые ф-ции? Использование ф-ций GetConsoleCP(), GetACP() и GetOEMCP() не увелчалось успехом. :( Использую VS2003, стоит в настройках: Unicode character Set, (/Zc:wchar_t), (/Zc:forScope) в Language. Спасибо |
| Автор: 586 1.6.2009, 19:54 | ||
|
| Автор: GremlinProg 1.6.2009, 19:55 |
| GetSystemDefaultLCID дает локаль принятую в системе GetUserDefaultLCID дает локаль принятую для текущего пользователя GetLocaleInfoEx - это общий метод, позволяющий извлекать разные данные локали по ее идентификатору, например: язык, страна, страница OEM, ACP и т.п. GetSystemDefaultLocaleName GetUserDefaultLocaleName - тут все аналогично с первыми двумя, только вместо локали возвращается ее имя (частный случай функции GetLocaleInfo) |
| Автор: vns955 1.6.2009, 23:10 |
| Пробовал подставлять то что возвращают ф-ции GetSystemDefaultLCID() и GetUserDefaultLCID() - не получилось :( |
| Автор: GremlinProg 1.6.2009, 23:55 |
| а, все понял, смотрел в CE, вот верная ссылка: http://msdn.microsoft.com/en-us/library/dd464799(VS.85).aspx |
| Автор: vns955 2.6.2009, 13:02 |
| GetLocaleInfoEx() поддерживает минимум Windows Server 2008, а я программирую под Server 2003. Можно ли обойтись без этой ф-ции? |
| Автор: GremlinProg 2.6.2009, 13:31 | ||||||||
вообще-то она даже в XP присутствует, я ее использовал без проблем, но если есть сомнения, используй просто GetLocaleInfo
в онлайне:
Добавлено через 2 минуты и 38 секунд а, нет, перепутал все верно - доступна только GetLocaleInfo |
| Автор: vns955 2.6.2009, 15:41 |
| Ну я пробовал использовать GetLocaleInfo() с флагом LOCALE_IDEFAULTCODEPAGE, она вернула 850. Я это значение подставил в setlocale() только с точкой т.е ".850" и то же самое :(. Мне кажется что не этом дело - пробовал я различные значения, нужно наверное копать в другую сторону. |
| Автор: GremlinProg 2.6.2009, 17:08 | ||||||||||
как так-то?
|
| Автор: GremlinProg 2.6.2009, 17:26 | ||||||||
уэльский:
чешский:
|
| Автор: vns955 2.6.2009, 17:31 |
| Ну да, именно так если использовать такие ф-ции как у Вас, но я юзал GetSystemDefaultLCID() для затравки, поэтому получил другие значения, но это ничего не меняет - все равно не выводит правильно :( |
| Автор: GremlinProg 2.6.2009, 17:44 |
| с GetSystemDefaultLCID аналогично (у меня они равны) vns955, я так полагаю, у тебя просто операционка на русскую локаль не настроена (смотри панель управления, язык и рег. стандарты и т.д.) |
| Автор: vns955 2.6.2009, 19:29 | ||
Проблема не в том чтоб русские символы выводить а чтоб правильно выводить другие, вот такой код неправильно выводит немецкие символы:
Немецкий в системе установлен, установлено чтоб использавать этот язык для не юникод символов. Far и Total Commander корректно отображает немецкие папки - русские нет, а если я установлю по-умолчанию русский - будет наоборот. Так вот мне надо чтоб моя прога работала так же :( |
| Автор: GremlinProg 2.6.2009, 19:58 |
перед setlocale попробуй поставить SetThreadLocale( lcid ) |
| Автор: vns955 3.6.2009, 12:46 |
| Не работает :(. А Вы так делали и работало? |
| Автор: GremlinProg 3.6.2009, 12:58 |
| нет, не пробовал, просто это единственная функция в API, которая позволяет сменить языковые стандарты в текщем потоке как еще один вариант - поэкспериментировать с CharToOem, совместно с SetThreadLocale не очень удобно, но надо хотя бы один рабочий вариант иметь (и мне кажется, тут локаль CRT желательно вообще не использовать, т.е. без setlocale, только API, чтобы не мешали они друг-другу) Добавлено через 1 минуту и 29 секунд по крайней мере до получения каких-либо вменяемых результатов |