Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/29: Рейтинг темы: голосов - 29, средняя оценка - 4.72
0 / 0 / 0
Регистрация: 08.10.2015
Сообщений: 17

Конвертация из char в wchar_t на с++ под Linux

31.10.2018, 14:11. Показов 5794. Ответов 4

Студворк — интернет-сервис помощи студентам
Приветствую всех!

Есть такая функция в обвертке к библиотеке на Windows. Переписал на Linux, однако в Ubunte при создании обвертки к библиотеке понял, что не работают конвертеры WideCharToMultiByte и MultiByteToWideChar.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
X509CertificateGetInfo(char inCert, INT propId, char* outData)
{
    unsigned long rv = 0;
    int tmpOutDataLength = 2048;
    std::vector<unsigned char> tmpOutData(tmpOutDataLength);
    int outDataWLen = 0;
    int tmpCertLen = WideCharToMultiByte(CP_UTF8, 0, (LPCWCH)inCert, wcslen(inCert), NULL, 0, NULL, NULL) + 1;
    std::vector<char> tmpCert(tmpCertLen);
    wchar_t *outDataW = NULL;
    CComBSTR bsResultStr;
 
    WideCharToMultiByte(CP_UTF8, 0, (LPCWCH)inCert, tmpCertLen, (LPSTR)&tmpCert[0], tmpCertLen, NULL, NULL);
    rv = kc_funcs->K_X509CertificateGetInfo(&tmpCert[0], tmpCertLen, propId, &tmpOutData[0], &tmpOutDataLength);
    if (!rv) {
        outDataWLen = MultiByteToWideChar(CP_UTF8, 0, (LPCCH)&tmpOutData[0], tmpOutDataLength, NULL, 0);
        std::vector<wchar_t> outDataW(outDataWLen);
        MultiByteToWideChar(CP_UTF8, 0, (LPCCH)&tmpOutData[0], tmpOutDataLength, (LPWSTR)&outDataW[0], outDataWLen + 1);
        bsResultStr.Append(&outDataW[0]);
        *outData = bsResultStr.Detach();
    }
    if (rv) {
        return S_FALSE;
    }
    return S_OK;
}
Подскажите, как правильно записать mbstowcs и wcstombs вместо WideCharToMultiByte и MultiByteToWideChar.

И еще вопрос:
Зачем нужны эти
Code
1
std::vector<>
почему нельзя просто написать?
C++
1
2
3
4
5
unsigned char tmpOutData[tmpOutDataLength] вместо std::vector<unsigned char> tmpOutData(tmpOutDataLength);
 
char  tmpCert[tmpCertLen]  вместо  std::vector<char> tmpCert(tmpCertLen);
 
const wchar_t  outDataW[outDataWLen]  вместо  std::vector<wchar_t> outDataW(outDataWLen)
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
31.10.2018, 14:11
Ответы с готовыми решениями:

wchar_t под linux => wchar_t под windows
Такая проблема. Написал одну программу под windows с использование библиотеки xerces-c. Теперь надо её пересобрать под линукс. Только есть...

Конвертация в wchar_t
Прочитал что если перед строковым литералом написать L то он будет приведён к типу wchar_t, но почему-то на выходе у меня получается адрес,...

Конвертация Cstring в wchar_t*
Есть функция, которая возвращает тип CString и нужно этот CString использовать в функции wcscpy. Как правильно сделать преобразования?

4
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,922
01.11.2018, 11:03
Странная у вас функция. Нет возвращаемого значения, вместо входной строки передается один символ.
Цитата Сообщение от miskiv_danil Посмотреть сообщение
Подскажите, как правильно записать mbstowcs и wcstombs
Исходя из man'а можно сделать так
mbstowcs( куда, откуда, не_больше_скольки_wchar'ов );
wcstombs( куда, откуда, не_больше_скольки_char'ов );
Цитата Сообщение от miskiv_danil Посмотреть сообщение
Зачем нужны эти std::vector<>
почему нельзя просто написать?
Не уверен, что std::vector гарантирует непрерывность данных, но это надо смотреть в документации.
делать char str[ var ]; нельзя, поскольку массивы переменной длины (vla) в С++ не являются стандартом. Лучше было бы сделать так:
C++
1
2
3
char *str = new char[val];
...
delete [] str;
Но не уверен как это встроится в ваш код.
0
5 / 5 / 0
Регистрация: 10.10.2014
Сообщений: 86
19.11.2018, 19:54
Зашел на форум чтобы задать подобный вопрос, но, к счастью, наткнулся на эту ветку.
Стоит задача преобразовать std::string в std::wstring
Следует использовать std::mbstowcs, перед этим посчитав количество символов и сделав resize std::wstring, или есть более элегантное решение?
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
20.11.2018, 13:02
Лучший ответ Сообщение было отмечено Peoples как решение

Решение

Цитата Сообщение от 4elovek37 Посмотреть сообщение
Стоит задача преобразовать std::string в std::wstring
Вообще такая постановка не совсем верна.
Корректно было бы, например, сказать: нужно преобразовать UTF-8 в UTF-32, или CP1251 в UTF-32. Т.к. std::string может содержать как строку в UTF-8, так и в CP1251, так и во многих других кодировках. А в std::wstring в зависимости от разрядности wchar_t также может быть принято хранить строки в разных кодировках (UTF-16 или UTF-32).
Поэтому давайте уточним задание сначала?

Добавлено через 13 минут
4elovek37, в принципе, если рассматривать исходную задачу топика, то в С++ можно сделать так:
C++
1
2
3
4
5
6
7
8
9
10
#include <codecvt>
#include <string>
#include <locale>
 
// convert UTF-8 string to wstring
std::wstring utf8_to_wstring(const std::string & str)
{
    std::wstring_convert<std::codecvt_utf8<wchar_t>> myconv;
    return myconv.from_bytes(str);
}
Гусарам, которые сейчас захотят напомнить про то, что wstring_convert начиная с С++17 deprecated, в свою очередь хочу напомнить, что стандарт приемлемых альтернатив не предоставил, а отдал это полностью на откуп программиста. Поэтому с пониманием того, что такое deprecated, вышеописанным способом вполне можно пользоваться.
2
5 / 5 / 0
Регистрация: 10.10.2014
Сообщений: 86
20.11.2018, 15:59
Цитата Сообщение от DrOffset Посмотреть сообщение
в принципе, если рассматривать исходную задачу топика, то в С++ можно сделать так
Да, нагуглил такой способ, но GCC 4.8.5 отказался это понимать, а более свежий изспользовать нельзя. К счастью, под рукой оказался буст:
C++
1
2
3
#include <boost/locale/encoding_utf.hpp>
//....
boost::locale::conv::utf_to_utf<wchar_t>(std_string);
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
20.11.2018, 15:59
Помогаю со студенческими работами здесь

Конвертация Float to wchar_t
Здравствуйте, уважаемые форумчане. Помогите, мне, пожалуйста. Как правильно перевести float в wchar_t? Все что я нашёл в интернете - не...

Конвертация UnicodeString в wchar_t
Начинаю только изучать С++ . Заранее прошу прощения за такой вопрос, не хотел задавать его на форуме, но уже прошло 4 дня, а я до сих пор...

Конвертация wchar_t в число целого типа. Обработка исключения
Конвертирую считываемые данные с Экселя в число типа int,для дальнейшей проверки вхождения в массив. buff содержит значение 12345qwe ...

char и wchar_t
Здравствуйте! Помогите разобраться вот в чем. Допустим у меня есть Edit Control с которого мне нужно забрать текст. GetWindowText...

Wchar_t to char
я тут обнаружил любопытнейшую вещь, оказывается можно просто присваивать char = wchar_t и наоборот ! просто хочу убедиться это как бы без...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это дополнительная запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru