Строковый литерал для basic_string <unsigned char> - PullRequest
2 голосов
/ 01 октября 2010

Когда дело доходит до интернационализации и Unicode, я - идиот, американский программист. Вот сделка.

#include <string>
using namespace std;

typedef basic_string<unsigned char> ustring;

int main()
{
    static const ustring my_str = "Hello, UTF-8!"; // <== error here
    return 0;
}

Выдается не неожиданная жалоба:

cannot convert from 'const char [14]' to 'std::basic_string<_Elem>'

Может, я сегодня выпил не ту порцию кофе. Как это исправить? Могу ли я сохранить базовую структуру:

ustring something = {insert magic incantation here};

Ответы [ 3 ]

5 голосов
/ 01 октября 2010

Узкие строковые литералы определены как const char, и нет строковых литералов без знака [1], поэтому вам придется приводить:

ustring s = reinterpret_cast<const unsigned char*>("Hello, UTF-8");

Конечно, вы можете поместить эту длинную вещьво встроенную функцию:

inline const unsigned char *uc_str(const char *s){
  return reinterpret_cast<const unsigned char*>(s);
}

ustring s = uc_str("Hello, UTF-8");

Или вы можете просто использовать basic_string<char> и получать от этого 99,9% времени, когда вы работаете с UTF-8.

[1]Если char не подписано, но зависит от реализации, бла, бла.

1 голос
/ 01 октября 2010

Использование разных типов символов для разных кодировок имеет те преимущества, которые компилятор лает на вас, когда вы их путаете. Недостатком является то, что вы должны конвертировать вручную.

Несколько вспомогательных функций для спасения:

inline ustring convert(const std::string& sys_enc) {
  return ustring( sys_enc.begin(), sys_enc.end() );
}

template< std::size_t N >
inline ustring convert(const char (&array)[N]) {
  return ustring( array, array+N );
}

inline ustring convert(const char* pstr) {
  return ustring( reinterpret_cast<const ustring::value_type*>(pstr) );
}

Конечно, все это молча и фатально, если преобразуемая строка содержит что-то кроме ASCII.

0 голосов
/ 01 октября 2010

Сделайте свою жизнь проще, используйте библиотеку строк UTF-8, такую ​​как http://utfcpp.sourceforge.net/ или используйте std :: wstring и используйте UTF-16.Вас может заинтересовать обсуждение другого вопроса о переполнении стека: C ++ строки: UTF-8 или 16-битная кодировка?

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