Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Есть ли в С++ аналог функции Encoding.UTF8.GetBytes(plainText) из С#? / 11 сообщений из 11, страница 1 из 1
18.11.2016, 19:34
    #39350103
Arbit
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть ли в С++ аналог функции Encoding.UTF8.GetBytes(plainText) из С#?
Здравствуйте уважаемые ГУРУ!

Переписываю свой код из С# на С++
Необходимо строку типа string перевести в vector<unsigned char>
Но загвоздка в том, что строка всегда содержи и латинские символы и кирилицу
и в vector идет однобайтовое представление символа кирилицы

Каким образом в С++ можно записать в vector кирилицу в двубайтной кодировке?

в С# я делал следующее (штатная функция):
Код: c#
1.
2.
string plainText = "FirstName=Николай";
var plainTextBytes = Encoding.UTF8.GetBytes(plainText);



и в окне отладке я получал нужный мне результат:
- plainTextBytes {byte[24]} byte[]
[0] 70 byte
[1] 105 byte
[2] 114 byte
[3] 115 byte
[4] 116 byte
[5] 78 byte
[6] 97 byte
[7] 109 byte
[8] 101 byte
[9] 61 byte
[10] 208 byte Это пошла кирилица в двубайтной кодировке
[11] 157 byte
[12] 208 byte
[13] 184 byte
[14] 208 byte
[15] 186 byte
[16] 208 byte
[17] 190 byte
[18] 208 byte
[19] 187 byte
[20] 208 byte
[21] 176 byte
[22] 208 byte
[23] 185 byte

В с++ я делаю следующее
Код: plaintext
1.
2.
string plainText = "FirstName=Николай";
vector<unsigned char> plainTextBytes(plainText.begin(), plainText.end());



В окне отладки:
- plainTextBytes { size=17 } std::vector<unsigned char,std::allocator<unsigned char> >
[size] 17 int
[capacity] 17 int
[0] 70 'F' unsigned char
[1] 105 'i' unsigned char
[2] 114 'r' unsigned char
[3] 115 's' unsigned char
[4] 116 't' unsigned char
[5] 78 'N' unsigned char
[6] 97 'a' unsigned char
[7] 109 'm' unsigned char
[8] 101 'e' unsigned char
[9] 61 '=' unsigned char
[10] 205 'Н' unsigned char Кирилица в однобайтовой кодировке
[11] 232 'и' unsigned char
[12] 234 'к' unsigned char
[13] 238 'о' unsigned char
[14] 235 'л' unsigned char
[15] 224 'а' unsigned char
[16] 233 'й' unsigned char

Мое гугление ничего конкретного кроме WideCharToMultiByte , не выдало.
А с параметрами этой функции я что-то притупил...

Может есть еще что-то штатное как в С#?

Заранее благодарен всем откликнувшимся
...
Рейтинг: 0 / 0
18.11.2016, 19:53
    #39350115
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть ли в С++ аналог функции Encoding.UTF8.GetBytes(plainText) из С#?
ArbitМое гугление ничего конкретного кроме *WideCharToMultiByte*, не выдало.
А с параметрами этой функции я что-то притупил...
А где там тупить-то? Всё просто как два рубля. Но раз у тебя строка в какой-то однобайтной
кодировке, то придётся использовать связку MultibyteToWideChar() + WideCharToMultibyte()
чтобы преобразовать сначала в юникод, а потом - в utf-8.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
18.11.2016, 20:36
    #39350129
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть ли в С++ аналог функции Encoding.UTF8.GetBytes(plainText) из С#?
Переписываю свой код из С# на С++
Необходимо строку типа string перевести в vector<unsigned char>

такая функция как ты хочешь просто нафиг не нужна в с++...

Но загвоздка в том, что строка всегда содержи и латинские символы и кирилицу
и в vector идет однобайтовое представление символа кирилицы

в vector идет ровно то, что ты туда положешь , так что все вопросы к тебе....

Каким образом в С++ можно записать в vector кирилицу в двубайтной кодировке?


utf8 нифига не двубайтовая кодировка ...


а теперь главный вопрос: в какой кодировке у тебя данные в std::string?
...
Рейтинг: 0 / 0
18.11.2016, 21:14
    #39350142
Arbit
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть ли в С++ аналог функции Encoding.UTF8.GetBytes(plainText) из С#?
MasterZiv, Спасибо за информацию.

Строка будет приходить из С# а там кодировка utf16
затем к этой строке добавятся данные из кода С++ и далее на шифрование и на сервер
...
Рейтинг: 0 / 0
18.11.2016, 22:00
    #39350156
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть ли в С++ аналог функции Encoding.UTF8.GetBytes(plainText) из С#?
ArbitСтрока будет приходить из С# а там кодировка utf16
байтовый массив в UTF-8 из c# будет проще принять

иначе - тот самый
Код: plaintext
1.
WideCharToMultiByte(CP_UTF8, ... )
...
Рейтинг: 0 / 0
18.11.2016, 23:06
    #39350168
Arbit
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть ли в С++ аналог функции Encoding.UTF8.GetBytes(plainText) из С#?
Изопропил, ты у меня как ангел-хранитьель :)
Спасибо!

Поскольку ты в теме моей истории - мне строку из шарпа (именно там кирилица)
нужно будет соединить с данными WMI (что мы обсуждали ранее), а там строка bstr_t.

И конечную строку нужно загнать в vector<unsignet char> для дальнейшей шифровки.
И кодировка символов в vector должна быть уже utf8

Как лучше слепить строку из шарпа со строкой bstr_t
а может как ты советуешь отправить из шарпа массив в уже готовой кодировке,
а потом добавить к нему символы из строки bstr_t?
...
Рейтинг: 0 / 0
19.11.2016, 01:51
    #39350197
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть ли в С++ аналог функции Encoding.UTF8.GetBytes(plainText) из С#?
Arbitа потом добавить к нему символы из строки bstr_t?
если обе строки bstr_t - их проще склеить в c++

ну а дальше -
Код: plaintext
1.
2.
3.
4.
        _bstr_t src = ... ;
	int sz =::WideCharToMultiByte(CP_UTF8, 0, src, src.length(), nullptr, 0, nullptr, nullptr);
	std::vector<byte> dst(sz);
	sz =::WideCharToMultiByte(CP_UTF8, 0, src, src.length(), (LPSTR)dst.data(), sz, nullptr, nullptr);



примечание - строки без нулевого терминатора
...
Рейтинг: 0 / 0
19.11.2016, 01:57
    #39350199
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть ли в С++ аналог функции Encoding.UTF8.GetBytes(plainText) из С#?
ArbitMasterZiv, Спасибо за информацию.

Строка будет приходить из С# а там кодировка utf16
затем к этой строке добавятся данные из кода С++ и далее на шифрование и на сервер


utf-16, на сколько я знаю, в std::string не влазит уже....
...
Рейтинг: 0 / 0
19.11.2016, 09:22
    #39350230
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть ли в С++ аналог функции Encoding.UTF8.GetBytes(plainText) из С#?
MasterZiv,

BSTR (_bstr_t) на входе у топикстартера, хотя он и пишет "строку типа string"
...
Рейтинг: 0 / 0
19.11.2016, 16:57
    #39350312
Arbit
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть ли в С++ аналог функции Encoding.UTF8.GetBytes(plainText) из С#?
Изопропил, спасибо большое, ты как всегда в яблочко! :)
Твои рекомендации самые лаконичные и результативные и что ОЧЕНЬ ПРИЯТНО - без "пальцев веером"
РЕСПЕКТ!

Очередной вопрос закрыт.

У меня скоро еще будет 2 вопроса.
Но это уже не по теме топика - где тебя искать?
Если я открою новую тему, ведь не факт что ты ее увидишь?
Или открыть тему и кинуть тебе ссылку на нее? А куда кидать ссылку?
В общем хочу с тобой дружить :)
...
Рейтинг: 0 / 0
19.11.2016, 17:43
    #39350319
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть ли в С++ аналог функции Encoding.UTF8.GetBytes(plainText) из С#?
Arbit,

Увижу, не беспокойся
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Есть ли в С++ аналог функции Encoding.UTF8.GetBytes(plainText) из С#? / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]