Что такое стандартная последовательность std :: wstring?

Я знаю, что у UTF-16 есть два типа порядковых номеров: большой или прямой порядок.

Определяет ли стандарт C ++ порядок байтов std :: wstring? или это определяется реализацией?

Если он определен стандартом, на какой странице стандарта C ++ представлены правила по этому вопросу?

Если это определяется реализацией, как определить это? например под VC ++. Гарантирует ли компилятор, что последовательность std :: wstring строго зависит от процессора?

Я должен знать это; потому что я хочу отправить строку UTF-16 другим. Я должен добавить правильную спецификацию в начале строки UTF-16, чтобы указать ее порядковый номер.

Короче говоря: учитывая std :: wstring, как мне надежно определить его порядковый номер?

2

Решение

Endianess зависит от MACHINE, а не от языка. Endianess определяется процессором и тем, как он организует данные в и из памяти. При работе с wchar_t (который шире, чем один байт), сам процессор при чтении или записи выравнивает несколько байтов так, как необходимо для повторного чтения или записи в ОЗУ. Код просто выглядит как 16-битное (или большее) слово, представленное во внутреннем регистре процессора.

Чтобы определить (если это действительно то, что вы хотите сделать) endianess (самостоятельно), вы можете попробовать записать 32-битное значение KNOWN (unsigned int) в ram, а затем прочитать его обратно, используя указатель на символ. Ищите порядок, который возвращается.

Это будет выглядеть примерно так:

unsigned int aVal = 0x11223344;
char * myValReadBack = (char *)(&aVal);

if(*myValReadBack == 0x11) printf("Big endian\r\n");
else                       printf("Little endian\r\n");

Я уверен, что есть и другие способы, но что-то похожее на вышесказанное должно сработать, хотя мой маленький против большого 🙂

Кроме того, до Windows RT VC ++ действительно компилировался только для процессоров типа Intel. Они действительно имели только один тип endianess.

5

Другие решения

Это определяется реализацией. wstring — это просто строка wchar_t, и это может быть любой порядок байтов или, в этом отношении, любой старый размер.

2

wchar_t не обязательно должен быть внутренним UTF-16, а порядковый номер UTF-16 не влияет на то, как хранятся wchar-ы, это вопрос сохранения и чтения.

Вы должны использовать явную процедуру преобразования wstring в байтовый поток UTF-16 перед его отправкой куда угодно. Внутренний порядковый номер wchar зависит от архитектуры, и для конвертации лучше использовать некоторые непрозрачные интерфейсы, чем пытаться конвертировать его вручную.

0

Для отправки правильной спецификации вам не нужно знать порядковый номер. Просто используйте код \ uFEFF. Это будет bigendian или little-endian в зависимости от порядкового номера вашей реализации. Вам даже не нужно знать, является ли ваша реализация UTF-16 или UTF-32. Пока это какая-то кодировка Unicode, вы получите соответствующую спецификацию.

К сожалению, ни wchars, ни широкие потоки не гарантированно являются юникодом.

-1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector