LINUX.ORG.RU

Кодировки в Mustdie

 , ,


0

2

Вот есть такой кусок исходника:

#define UNICODE
#include <windows.h>

int main()
{
    const char *text = "Русские буковки";

    wchar_t *text_1251 = new wchar_t(strlen(text) + 1);
    memset(text_1251, 0, (strlen(text) + 1) * sizeof(wchar_t));
    MultiByteToWideChar(1251, 0, text, strlen(text), text_1251, strlen(text) + 1);

    wchar_t *text_utf16 = new wchar_t(strlen(text) + 1);
    memset(text_utf16, 0, (strlen(text) + 1) * sizeof(wchar_t));
    MultiByteToWideChar(CP_UTF8, 0, text, strlen(text), text_utf16, strlen(text) + 1);

    MessageBox(NULL, text_1251, L"", MB_OK);
    MessageBox(NULL, text_utf16, L"", MB_OK);

    return 0;
}

При запуске этой гадости сначала вылазит сообщение с русскими буковками, а затем с черными квадратиками. А винда, по идее, умеет в Юникод. Но все равно квадратики. Это все происходит, если здесь внизу поставить русский язык. Если английский, то во втором случае русские буковки работают (да и вообще любые). Почему так?

А линукс тут при том, что винда мастдай, а линукс — нет.

P.S. разработка под винду — это боль.

Просто ты не умеешь. Так там вроде дефолтом идёт cp866 в русской локали в качестве _однобайтовой_ кодировки, откуда ты cp1251 взял — хз.

anonymous
()
Ответ на: комментарий от anonymous

Сам хз. Но если преобразовывать строку в cp1251 ( MultiByteToWideChar(1251, ...)) русский текст таки отображается. А вообще вопрос состоит в том, чтобы нормально юзать юникод.

Kotolegokot
() автор топика

MultiByteToWideChar(CP_UTF8, 0, text, strlen(text), text_utf16, strlen(text) + 1);

А с чего ты взял что содержимое text в UTF8? Скорее всего компилятор использует для литерала локальную кодировку, т.е. 1251. CP_UTF8 в винде вообще редко используется

annulen ★★★★★
()
Ответ на: комментарий от Kotolegokot

А вообще вопрос состоит в том, чтобы нормально юзать юникод.

Чтобы нормально юзать юникод, нужно корректно перекодировать текст в UTF16

annulen ★★★★★
()
Ответ на: комментарий от Kotolegokot

Ну в данном случае корректно задать кодировку входных данных: 1251 подходит, а CP_UTF8 - нет. Но можно и UTF16-литералы использовать, типа L"Русские буковки"

annulen ★★★★★
()
Ответ на: комментарий от annulen

Я тут проверил. У меня на самом деле строки были в cp1251. Поэтому они коряво конвертировались в utf16. И оказывается, gettext возвращает строки не в utf8, как я ожидал, а в cp1251. Притом только для строк, в которых нет символов, не входящих в cp1251. Т.е., например, если назначить в файле локазлизации «Start» -> «日Старт», то gettext(«Start») возвращает строку в utf8, которая замечательно конвертируется в utf16 и отображается не краказябрами.

Kotolegokot
() автор топика
Ответ на: комментарий от annulen

Не знаешь, как заставить gettext возвращать utf8 в таком случае?

Kotolegokot
() автор топика
Ответ на: комментарий от annulen

Нашел: нужно вызвать bind_textdomain_codeset(*domain_name*, «utf-8»);

Kotolegokot
() автор топика

А кодировка твоего исходного файла какая? Она тоже роль играет.

peregrine ★★★★★
()
Ответ на: комментарий от Kotolegokot

ообще вопрос состоит в том, чтобы нормально юзать юникод

boost::nowide

anonymous
()

На винфак.

Deleted
()
MessageBoxW(NULL, text_1251, L"", MB_OK);
MessageBoxW(NULL, text_utf16, L"", MB_OK);

А вообще - с этой ублюдочной вендосранью - марш на винфак, там найдёшь себе корешей о своих вендопроблемах поныть.

Stanson ★★★★★
()
Последнее исправление: Stanson (всего исправлений: 2)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.