Протокол буфера и UTF-8 - PullRequest
       29

Протокол буфера и UTF-8

3 голосов
/ 26 января 2010

История схем кодирования / нескольких операционных систем и порядковых номеров приводила к путанице с точки зрения кодирования всех форм строковых данных (т.е. всех алфавитов); по этой причине буферы протокола имеют дело только с ASCII или UTF-8 в его строковых типах, и я не вижу никаких полиморфных перегрузок, которые принимают строку C ++. Тогда возникает вопрос: как получить строку UTF-16 в буфер протокола?

Предположительно, мне нужно сохранить данные как wstring в коде моего приложения, а затем выполнить преобразование UTF-8, прежде чем я вставлю их в сообщение (или извлеку из него). Каков самый простой - переносимый способ Windows / Linux сделать это (один день вызова функции из хорошо поддерживаемой библиотеки сделает мой день)?

Данные будут поступать с различных веб-серверов (Linux и Windows) и в конечном итоге окажутся в SQL Server (и, возможно, в других конечных точках).

- редактировать 1 -

Предложение Марка Уилкинса, кажется, отвечает всем требованиям, возможно, кто-то, имеющий опыт работы с библиотекой, может опубликовать фрагмент кода - от wstring до UTF-8 - чтобы я мог оценить, насколько легко это будет.

- редактировать 2 -

предложение еще больше. Я буду исследовать повышение сериализации в дальнейшем.

Ответы [ 4 ]

3 голосов
/ 26 января 2010

Взгляните на UTF8-CPP :

// converts a utf-8 encoded std::string s to utf-16 wstring ws
utf8to16(s.begin(), s.end(), back_inserter(ws));
3 голосов
/ 26 января 2010

Библиотека Boost Serialization содержит кодовый код UTF-8 , который можно использовать для преобразования Unicode в UTF-8 и обратно. Там даже есть пример в документации, делающий именно это.

2 голосов
/ 26 января 2010

Это может быть излишним, но библиотеки ICU сделают все, что вам нужно, и вы можете использовать их как в Windows, так и в Linux.

Однако, если вы хотите только преобразование, топод Windows простой вызов MultiByteToWideChar и WideCharToMultiByte может выполнить преобразование между UTF-8 и

UTF-16.Например:

// utf-8 to utf-16
MultiByteToWideChar( CP_UTF8, 0, myUtf8String, -1,
                     myUtf16Buf, lengthOfUtf16Buf );

В Linux libidn может делать то, что вам нужно.Он может конвертировать между UTF-8 и UCS, что, на мой взгляд, эквивалентно UTF-32 на некотором уровне.Например:

// utf-8 to UCS
ucsStr = stringprep_utf8_to_ucs4( "asdf", 4, &items );

Однако в Linux я думаю, что вам лучше всего просто работать с UTF-8.Если у вас нет существующей библиотеки для UTF-16, я не уверен, что есть веская причина использовать ее в Linux.

1 голос
/ 26 января 2010

В Linux это тривиально: каждый wchar_t представляет собой одну кодовую точку Unicode, а с помощью тривиальных битопов вы можете найти соответствующие байты UTF-8. В Windows это не намного сложнее, так как для этого есть API: WideCharToMultiByte(CP_UTF8, 0, input.c_str(), input.size(), &out[0], out.size(), 0,0);

...