Как конвертировать Java String в C ++ String, используя байты в качестве носителя - PullRequest
2 голосов
/ 16 сентября 2011

Каков будет алгоритм / реализация кода C ++ C++functionX в следующей блок-схеме:

(JavaString) --getBytes--> (bytes) --C++functionX--> (C++String)

JavaString содержимое должно максимально соответствовать C++String содержимому (предпочтительно 100%для всех возможных значений JavaString)

[EDIT] Порядковый номер байтов можно игнорировать, так как есть способы справиться с этим.

Ответы [ 4 ]

3 голосов
/ 16 сентября 2011

Java:

String original = new String("BANANAS");
byte[] utf8Bytes = original.getBytes("UTF8");
//save the length as a 32 bit integer, then utf8 Bytes to a file

C ++:

int32_t tlength;
std::string utf8Bytes;
//load the tlength as a 32 bit integer, then the utf8 bytes from the file
//well, that's easy for UTF8

//to turn that into a utf-18 string in windows
int wlength = MultiByteToWideChar(CP_UTF8, 0, utf8Bytes.c_str(), utf8Bytes.size(), nullptr, 0);
std::wstring result(wlength, '\0');
MultiByteToWideChar(CP_UTF8, 0, utf8Bytes.c_str(), utf8Bytes.size(), &result[0], wlength);
//so that's not hard either

Для этого в linux используется библиотека iconv, которая невероятно мощная, но более сложная в использовании. Вот функция, которая преобразует std::string в UTF8 в std::wstring в UTF32: http://coliru.stacked -crooked.com / view? Id = 986a4a07e391213559d4e65acaf231d5-e54ee7a04e4b807da0930236d4cc94dc *

1 голос
/ 16 сентября 2011

C ++, насколько говорит стандарт, не знает о кодировках.Ява делает.Итак, чтобы связать их, заставьте Java генерировать определенную кодировку, например UTF8:

byte[] utf8str = str.getBytes("UTF8");

В C ++ используйте библиотеку, например iconv(), чтобы преобразовать строку UTF8 в другую строкучетко определенной кодировки (например, std::u32string с UTF-32, если у вас есть C ++ 11 или std::basic_string<uint32_t> или std::vector<uint32_t> в противном случае), или, альтернативно, преобразуйте его в кодировку WCHAR_T, чтобы сохранитьв std::wstring и продолжайте преобразовывать ее в многобайтовую строку через стандартную функцию wcstombs(), если вы хотите взаимодействовать с вашей средой.

Выбор зависит от того, что вам нужно делать сстрока.Для сериализации или обработки текста используйте определенную кодировку (например, UTF-32).Для записи в стандартный вывод с использованием языкового стандарта системы используйте многобайтовое преобразование.(Здесь немного более длинное обсуждение кодировок в C ++.)

1 голос
/ 16 сентября 2011

Нет такой вещи, как класс One True C ++ String.Один STL имеет std::string и std::wstring.Тем не менее, большинство строковых классов имеют конструктор, который принимает необработанный байтовый указатель в качестве параметра.Байты входят в форму const char *.Итак, хорошим примером вашего C++functionX является конструктор std::string::string(const char*, int).

Обратите внимание на проблемы с кодировкой.getBytes () принимает кодировку в качестве параметра;вам лучше соответствовать этому на стороне C ++, или вы получите беспорядок.Если вы не уверены, используйте UTF-8.

В зависимости от того, какие у вас есть строки Java, вы можете выбрать обычные или широкие строки (например, std::wstring).Последнее немного лучше отражает то, что предлагает Java String.

0 голосов
/ 16 сентября 2011

строка C ++, вероятно, должна быть экземпляром std :: wstring, и вам также необходимо отслеживать кодировку, которую вы будете использовать для преобразования из JavaString в байты.

Эта статья, вероятно, поможет вам больше:

std :: wstring VS std :: string

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...