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

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

31.10.2018, 14:11. Показов 5709. Ответов 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
4079 / 2677 / 432
Регистрация: 09.09.2017
Сообщений: 11,888
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
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
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
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru