Можете ли вы написать UTF-8, UTF-16 и std :: wstring для представления символов Unicode "U + 9FA5 (龥)" и "U + 0041 (A)"? - PullRequest
0 голосов
/ 24 ноября 2010

Пожалуйста, укажите, есть ли разница в представлении между машинами Windows и Linux (, например, std :: wstring, занимающий 4 байта в Linux и 2 байта в Windows ). И, если необходимо, укажите также порядковый номер.

Ответы [ 3 ]

1 голос
/ 24 ноября 2010

utf-16BE, которая является кодовой страницей, используемой в семействе продуктов MS Office, будет хранить все символы как 2 байта и в значительной степени идентична "стандартной" части набора символов Unicode.

Linux, вероятно, использует utf-8, который будет хранить стандартные символы ASCII в одном байте , но может хранить другие символы Unicode в двух, трех или четырех байтах, в зависимости от кодовой точки Unicode. Поскольку самые левые биты заняты флагами, чтобы указать, что это не ascii и как далеко вы находитесь в многобайтовом символе. (Идея в том, что вы можете прыгнуть в строку utf-8 со случайного байта и найти начало символа, в котором находитесь.)

Для большинства дальневосточных наборов символов, которые имеют высокие кодовые точки в собственном Юникоде (как используется Java), обычно более эффективен в пространстве и времени обработки, чем UTF-8.

1 голос
/ 24 ноября 2010

Нет, я не могу.Но этот сайт может.

0 голосов
/ 24 ноября 2010

Это то, что вы хотите:

int main()
{
    std::wstring  data1 = L"U+9FA5 (\0x9FA5)";
    std::wstring  data2 = L“U+0041 (A)";
}

wstring - это просто контейнер объектов wchar_t.
Не подразумевается кодировка символов (она просто хранит то, что вы положили).

Windows wchar_t в настоящее время имеет 2 байта, поэтому она может хранить только символы UTF-16.Линус wchar_t обычно составляет 4 байта.Поэтому он может использовать кодировку UTF-16 или UTF-32.Хотя в большинстве нормальных ситуаций это перекрытие и верхняя половина просто равны нулю (за исключением, конечно, кодовых точек, отсутствующих в BMP или суррогатных парах).

Примечание: символы UTF-8 обычно не используются внутри (хотяони могут быть) в приложении, поскольку они не имеют фиксированной ширины.Но это чрезвычайно полезно для транспортировки и хранения из-за его сжимаемости (и обратная совместимость с ASCII не повредит).

Примечание: C / C ++ не исключает использование других форматов кодирования для своих строк.

...