为什么短*而不是char *为字符串? char *和unsigned char *之间的区别?

正如标题所说,我有两个问题。

编辑 :为了澄清,他们实际上并没有使用charshort ,他们确保它们是特定typedef的8位和16位。 然后将实际类型称为UInt8UInt16

1.问题

iTunes SDK使用unsigned short* ,需要字符串 。 使用它而不是char* / unsigned char*什么好处? 如何将其转换为char* ,以及使用此类型时有何不同?

2.问题

我只看到char*当时必须存储一个字符串。 我什么时候应该使用unsigned char* ,或者它没有任何区别?

unsigned short数组可以与宽字符串一起使用 – 例如,如果你有UTF-16编码文本 – 虽然我希望在这些情况下看到wchar_t 。 但他们可能有他们的理由,比如在MacOS和Windows之间兼容。 (如果我的来源是正确的,MacOS的wchar_t是32位,而Windows’是16位。)

您可以通过调用相应的库函数在两种类型的字符串之间进行转换。 哪种function合适取决于具体情况。 SDK不附带一个吗?

而且, char而不是unsigned char ,所有字符串历来总是用char定义,因此切换到unsigned char会引入不兼容性。
(切换到signed char也会导致不兼容,但不知道多少……)

编辑现在问题已被编辑,让我说在输入答案之前我没有看到编辑。 但是,由于上述原因, UInt16比wchar_t更能代表16位实体。

1.问题 – 答案

我认为他们使用unsigned short *因为他们必须对unicode字符使用UTF-16编码,因此代表BMP内外的字符。 问题的其余部分取决于源和目标的Unicode编码类型(UTF-8,16,32)

2.问题 – 答案

再次取决于编码类型和你在说什么字符串。 如果计划处理扩展ASCII表之外的字符串,则不应使用有符号或无符号字符。 (除英语外的任何其他语言)

  1. 可能是一个使用UTF-16字符串的harebrained尝试。 C具有宽字符类型wchar_t ,其char (或wchar_t s)可以是16位长。 虽然我对SDK不够熟悉,但是为什么他们确切地说他们经历了这条路线,但它可能会解决编译器问题。 在C99中有更合适的[u] int [least / fast] 16_t类型 – 参见

    请注意,C对数据类型及其基础大小的保证很少。 有符号或无符号短路不保证是16位(尽管它们保证至少那么多),字符也不限于8或16或32的宽带。

    要在char和短字符串之间进行转换,您需要使用SDK提供的转换函数。 如果您确切地知道它们存储在那些短字符串中的内容以及您在char字符串中想要的内容,您也可以自己编写或使用第三方库。

  2. 它并没有真正有所作为。 如果你想对unsigned char进行(无符号)算术或位操作,通常会转换为unsigned char

编辑:在你告诉我们他们使用了UInt16而不是unsigned short之前,我写了(或者开始写,无论如何)这个答案。 在这种情况下,没有涉及野兔的大脑; 专有类型可能用于与不具有stdint类型的旧(或不符合)编译器兼容,以存储UTF-16数据。 这是完全合理的。