Определение строк UTF-16BE в C ++ - PullRequest
1 голос
/ 16 января 2012

Мне нужно определить строку в кодировке Юникод, которая бы выглядела так:

const char SOME_STRING[] = { 0, 5, 0, 'M', 0, 'y', 0, 'S', 0, 't', 0, 'r' };

Это строка UTF-16BE с предваряющим байтом с прямым порядком байтов, содержащая длину, она используется в Java, и это то, что мне нужно.Есть ли лучший / более чистый способ объявить это, чем вводить каждый символ отдельно?

Ответы [ 2 ]

0 голосов
/ 16 января 2012

C и C ++ не определяют, как работает порядок байтов на платформе, на которой они работают.Следовательно, в самом языке нет способа объявить последовательность 16-битных значений как "big endian".

То, что вам нужно сделать, это получить строку в native endian платформы.Затем выполните обмен байтов, если порядковый номер платформы не является прямым порядком байтов.Вы можете сохранить версию с байтовым обменом в std::vector или некотором другом.

0 голосов
/ 16 января 2012

Вместо этого вы можете использовать wchar_t, преобразовывая в байты по требованию, например:

const wchar_t some_string[] = L"\x05MyStr";

int _tmain(int argc, _TCHAR* argv[])
{
    for (int i = 0; i <= some_string[0]; i++)
        printf("%d %d ", some_string[i] >> 8, some_string[i] & 0xFF);

    return 0;
}
...