0 / 0 / 0
Регистрация: 09.01.2014
Сообщений: 9
1

Приложение с русским шрифтом в английском Windows (возможно локализация)

09.01.2014, 13:36. Показов 2299. Ответов 10
Метки нет (Все метки)

Задача: корректно отображать надписи на русском языке под чистым английским Windows без всяких русификаторов.
Приложение SDI. Собрано с настройкой Character Set: Use Multi-Byte Character Set. Все ресурсы на русском языке. Тестирую на Windows7 Home. Используемые шрифты в системе есть.

После запуска часть надписей отображаются правильно, часть знаками вопросов, а часть иероглифами.
Корректно отображаются те надписи, которые загружены из ресурсов (на диалогах) или те, которые сделаны шрифтом, созданным программно с параметром RUSSIAN_CHARSET.
Знаками вопросов отображаются надписи в главном меню и на тех элементах управления, над которыми программно были выполнены некоторые действия (например EnableWindow() или ShowWindow() или др.)
Иероглифами отображаются надписи, которые зашиты в код программы.

Как пример желаемого результата могу привести Total Commander 8. Меню, надписи на кнопках и в диалогах отображаются правильно. Хотя имена некоторых файлов и содержимое списков на диалогах все же отображены иероглифами. Вот каким образом он это делает?

В каком направлении копать?
Возможно ли впринципе решить такую задачу с Multi-Byte Character Set или нужен юникод?
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.01.2014, 13:36
Ответы с готовыми решениями:

Работа с русским шрифтом в консоли
Здравствуйте! Хотел уточнить, насколько вариант ниже для работы с функцией towupper() и ей подобным...

Проблемы с русским шрифтом при выводе в капчу....
Вот просто в целях изучения работы с изображениями .. делаю что то вроде капчи... очень примитивной...

Сделать надпись готическим шрифтом на английском языке
Вообщем проблема вот в чем. Нужно написать надпись готическим шрифтом на английском языке но маткад...

Microsoft windows приложение не отвечает . Возможно, что приложение ответит , если подождать
Началось 2 дня назад до этого того небыло делал memtest86 и проверял жеский диск на наличие bad...

10
Ушел с форума
Эксперт С++
16429 / 7393 / 1186
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
09.01.2014, 14:32 2
Цитата Сообщение от vvoovv Посмотреть сообщение
Возможно ли впринципе решить такую задачу с Multi-Byte Character Set или нужен юникод?
Нужен Юникод. Multi-Byte - это вообще наследие прошлого, он был нужен
лет пятнадцать назад, когда Юникод только-только появился и поддерживался
не всеми системами. Сейчас, если только вы не пишете под какую-нибудь
Windows 98, нет никакого смысла использовать Multi-Byte (это еще и плохо
сказывается на производительности, т.к. Windows "внутри" давно работает с
Юникодом, а большая часть ANSI-функций является просто обертками над
своими Юникодными аналогами. В общем, получается дополнительное
перекодирование туда-сюда).

Кстати, Microsoft уже потихоньку отказывается от Multi-Byte в своих библиотеках
для Visual C++, как когда-то сделала это для single-threaded runtime library.
0
0 / 0 / 0
Регистрация: 09.01.2014
Сообщений: 9
09.01.2014, 15:13  [ТС] 3
Допустим будет юникод. Но я так понимаю только этого не достаточно. Нужны еще какие-то действия, чтобы задать локаль для приложения независимо от локали виндовз. Какие?
0
Ушел с форума
Эксперт С++
16429 / 7393 / 1186
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
09.01.2014, 15:16 4
Цитата Сообщение от vvoovv Посмотреть сообщение
Допустим будет юникод. Но я так понимаю только этого не достаточно.
Для отображения текста, использующего символы различных алфавитов и
письменностей, этого достаточно. Например, я могу тем же MessageBoxW
вывести сообщение с заголовком на русском языке, которое показывает
файловый путь с китайскими иероглифами и комментариями на греческом.
Никаких дополнительных манипуляций не требуется.

Цитата Сообщение от vvoovv Посмотреть сообщение
Нужны еще какие-то действия, чтобы задать локаль для приложения независимо от локали виндовз. Какие?
Работать с локалями нужно в том случае, если требуется, к примеру,
отображать денежные единицы или время в соответствующих форматах.
Или, допустим, сравнивать или сортировать строки с учетом локализации.
0
0 / 0 / 0
Регистрация: 09.01.2014
Сообщений: 9
09.01.2014, 15:24  [ТС] 5
Приложение собрано с использованием статических библиотек. Есть и длл. Нужно ли все эти библиотеки переводить на юникод или это не обязательно? На что вообще следует обратить внимание при переводе приложения на юникод (подводные камни, частые ошибки)?
0
Ушел с форума
Эксперт С++
16429 / 7393 / 1186
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
09.01.2014, 16:13 6
Цитата Сообщение от vvoovv Посмотреть сообщение
Приложение собрано с использованием статических библиотек. Есть и длл. Нужно ли все эти библиотеки переводить на юникод или это не обязательно?
Трудно сказать, не видя самих библиотек и не зная, что это за библиотеки.
Обычно проблем не должно быть. Если типы меняются (char -> wchar_t, например),
тогда меняются и сигнатуры функций, тогда в случае каких-то несостыковок
вылазят ошибки компилятора. Но это хорошо, хуже если бы все "замалчивалось".

Цитата Сообщение от vvoovv Посмотреть сообщение
На что вообще следует обратить внимание при переводе приложения на юникод (подводные камни, частые ошибки)?
sizeof (wchar_t) != sizeof (char).
Пожалуй, это самая главная ошибка, из которой берут начало многие остальные.
Вместо std::string нужно будет использовать std::wstring, вместо strlen - wcslen и т.д.
В принципе, ничего особо сложного. Кстати, Юникод - это не обязательно UTF-16 и wchar_t,
для хранения строк в UTF-8 можно использовать и std::string. Такое возможно.
0
0 / 0 / 0
Регистрация: 09.01.2014
Сообщений: 9
17.01.2014, 13:41  [ТС] 7
В библиотеках в сигнатурах методов используется CString, поэтому пришлось их тоже переводить на юникод.

При необходимости конвертации Юникод<>Мультибайт использую wcstombs_s и mbstowcs_s.

Если необходимо мультибайт строку std::string перевести в юникод CString, то делаю так:
1. std::string перевожу в std::wstring при помощи mbstowcs_s
2. создаю CString на основе std::wstring wStr.c_str()

Но заметил такой момент. Если объект CString уже создан, то с помощью оператора = ему можно присвоить мультибайт строку:
C++
1
2
3
CString str;
std::string mbStr = "qwerty";
str = mbStr.c_str();
Т.е. перевод в юникод я не делаю, но такое впечатление, что в CString ложится юникод. В связи с этим и возник вопрос. Действительно ли CString сам преобразует строку или это побочный эфект Debug версии и в Release на этом месте вылезут проблемы?
0
Ушел с форума
Эксперт С++
16429 / 7393 / 1186
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
17.01.2014, 14:46 8
Цитата Сообщение от vvoovv Посмотреть сообщение
Действительно ли CString сам преобразует строку
Похоже, так и есть. Visual C++ 2008 SP1:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
CStringT& operator=( _In_opt_z_ PCYSTR pszSrc )
{
    // nDestLength is in XCHARs
    int nDestLength = (pszSrc != NULL) ? StringTraits::GetBaseTypeLength( pszSrc ) : 0;
    if( nDestLength > 0 )
    {
        PXSTR pszBuffer = GetBuffer( nDestLength );
        StringTraits::ConvertToBaseType( pszBuffer, nDestLength, pszSrc);
        ReleaseBufferSetLength( nDestLength );
    }
    else
    {
        Empty();
    }
 
    return( *this );
}
0
Заблокирован
Автор FAQ
19.01.2014, 15:17 9
Цитата Сообщение от vvoovv Посмотреть сообщение
wcstombs_s и mbstowcs_s.
- эти функции чувствительны к локалям.
Рекомендую 1251 и можно 866
0
0 / 0 / 0
Регистрация: 09.01.2014
Сообщений: 9
20.01.2014, 13:14  [ТС] 10
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- эти функции чувствительны к локалям.
Рекомендую 1251 и можно 866
Почему? Можно подробнее?
0
0 / 0 / 0
Регистрация: 09.01.2014
Сообщений: 9
22.01.2014, 16:09  [ТС] 11
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- эти функции чувствительны к локалям.
Рекомендую 1251 и можно 866
Похоже понял, что имеется в виду. Эти функции используют текущую локаль ОС.

Добавлено через 16 минут
Цитата Сообщение от vvoovv Посмотреть сообщение
Действительно ли CString сам преобразует строку
При таком преобразовании также используется текущая локаль. Чтобы отображать кириллицу при английской локали, нужно использовать функции _wcstombs_s_l и _mbstowcs_s_l с явным указание требуемой локали.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.01.2014, 16:09

Возможно ли подключить Microsoft App Center в приложение Windows Forms?
Возможно ли подключить Microsoft Visual Studio App Center (https://appcenter.ms/) в приложение...

Возможно ли, введя строку на английском вывести ее на русском?
Возможно ли, введя строку на английском вывести ее на русском? Например я ввел: qwerty, а мне...

Композитное приложение не работает в клиенте с русским интерфейсом
Композитное приложение не работает в клиенте с русским интерфейсом Ошибка: ReferenceError: XSP is...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.