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

时间:2012-02-15 14:39:51

标签: c character-encoding char unsigned short

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

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

1。问题

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

2。问题

我必须在必须存储字符串时才看到char*。我应该何时使用unsigned char*,或者它不会有任何区别?

3 个答案:

答案 0 :(得分:5)

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

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

char代替unsigned char,所有字符串历来始终都使用char定义,因此切换到unsigned char会引入不兼容性。
(切换到signed char也会导致不兼容,但不会有多少......)

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

答案 1 :(得分:1)

<强> 1。问题 - 答案

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

<强> 2。问题 - 答案

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

答案 2 :(得分:1)

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

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

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

  2. 它并没有什么区别。如果你想对一个字符进行(无符号)算术或位操作,你通常会转换为unsigned char

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