Почему short * вместо char * для строки? Разница между char * и unsigned char *? - PullRequest
0 голосов
/ 15 февраля 2012

Как видно из названия, у меня два вопроса.

Редактировать : Чтобы уточнить, они на самом деле не используют char и short, они гарантируют, что они будут 8-битными и 16-битными по определенным typedef. Фактический тип тогда называется UInt8 и UInt16.

1. Вопрос

iTunes SDK использует unsigned short*, где требуется строка . Каковы преимущества его использования вместо char* / unsigned char*? Как преобразовать его в char*, и что отличается при работе с этим типом вместо

2. Вопрос

Я видел char* только когда нужно сохранить строку, пока. Когда я должен использовать unsigned char* тогда, или это не имеет никакого значения?

Ответы [ 3 ]

5 голосов
/ 15 февраля 2012

unsigned short массивы можно использовать со строками широких символов - например, если у вас есть тексты в кодировке UTF-16 - хотя я ожидаю увидеть wchar_t в этих случаях. Но у них могут быть свои причины, например, совместимость между MacOS и Windows. (Если мои источники верны, MacOS 'wchar_t составляет 32 бита, а Windows' - 16 бит.)

Вы конвертируете между двумя типами строк, вызывая соответствующую библиотечную функцию. Какая функция подходит, зависит от ситуации. SDK не входит в комплект?

И char вместо unsigned char, ну, все исторически всегда были определены с char, поэтому переход на unsigned char привел бы к несовместимости.
(Переход на signed char также может привести к несовместимости, но не так много ...)

Редактировать Теперь вопрос отредактирован, позвольте мне сказать, что я не видел правок до того, как набрал свой ответ. Но да, UInt16 является лучшим представлением 16-битного объекта, чем wchar_t по вышеуказанной причине.

1 голос
/ 15 февраля 2012
  1. Вероятно, попытка использовать умение использовать строки UTF-16. C имеет тип широкий символ , wchar_t, а его char s (или wchar_t s) может иметь длину 16 бит. Хотя я не достаточно знаком с SDK, чтобы сказать, почему именно они прошли этот маршрут, возможно, нужно обойти проблемы с компилятором. В C99 есть гораздо более подходящие типы [u] int [наименьший / быстрый] 16_t - см. <stdint.h>.

    Обратите внимание, что C дает очень мало гарантий относительно типов данных и их базовых размеров. Подписанные или неподписанные шорты не гарантируются равными 16 битам (хотя они гарантированно должны быть как минимум такими же большими), равно как и символы не ограничены 8 или широкими символами 16 или 32.

    Для преобразования между символами и короткими строками вы должны использовать функции преобразования, предоставляемые SDK. Вы также можете написать свою собственную или использовать стороннюю библиотеку, если точно знаете, что они хранят в этих коротких строках И что вы хотели в строках символов.

  2. Это действительно не имеет значения. Обычно вы конвертируете в unsigned char, если хотите использовать (без знака) арифметику или битовые манипуляции с символом.

Edit: я написал (или начал писать, во всяком случае) этот ответ, прежде чем вы сказали нам, что они использовали UInt16, а не unsigned short. В этом случае нет мозгов зайцев; проприетарный тип, вероятно, используется для совместимости со старыми (или несовместимыми) компиляторами, которые не имеют типов stdint, для хранения данных UTF-16. Что вполне разумно.

1 голос
/ 15 февраля 2012

1. Вопрос - Ответ

Я бы предположил, что они используют unsigned short *, потому что они должны использовать кодировку UTF-16 для символов Unicode и, следовательно, представлять символы как внутри, так и вне BMP. Остальная часть вашего вопроса зависит от типа кодировки Unicode источника и пункта назначения (UTF-8,16,32)

2. Вопрос - Ответ

Опять же, зависит от типа кодировки и о каких строках вы говорите. Никогда не следует использовать подписанные или неподписанные символы, если вы планируете работать со строками символов вне таблицы Extended ASCII. (Любой другой язык, кроме английского)

...