2012-02-15 64 views
0

正如标题所说,我有两个问题。为什么用*代替char *来代替字符串? char *和unsigned char *之间的区别?

编辑:为了澄清,他们没有实际使用charshort,他们确保他们是8位和16位的具体类型定义。实际类型则称为UInt8UInt16

1提问

iTunes的SDK使用unsigned short*其中需要。使用它有什么好处,而不是char*/unsigned char*?如何将其转换为char*,而使用这种类型时会有什么不同?

2.问

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

+0

'short'是2个字节的类型,而'char'是1个字节的类型。我不知道为什么SDK使用'short *'指向一个字符串。你确定它确实吗? – Eregrith 2012-02-15 14:42:46

+0

@Eregrith'short'不保证是两个字节宽。 – 2012-02-15 14:44:23

+0

@Eregrith'typedef UInt16 UniChar;',它的使用类似于'UniChar * someString;'。 – 2012-02-15 14:44:31

回答

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提问 - 回答

我会假设他们使用无符号短*,因为它们必须使用UTF-16编码的Unicode字符,因此代表在国内外享有很高的BMP的字符。你的问题的其余部分取决于源和目的地(UTF-8,16,32)

2.问题的Unicode编码的类型 - 答

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

1
  1. 可能是使用UTF-16字符串的轻率尝试。 C具有wide character类型,wchar_t及其char(或wchar_t)可以是16位长。虽然我对SDK不够熟悉,不知道为什么他们完成了这条路线,但可能要解决编译器问题。在C99中有更适合的[u] int [最小/快速] 16_t类型 - 请参阅<stdint.h>

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

    要在字符和短字符串之间进行转换,您'使用SDK提供的转换功能。如果您确切知道它们存储在这些短字符串中以及您想要的字符串中,您还可以编写自己的或使用第三方库。

  2. 它并没有真正的区别。如果您想对字符进行(无符号)算术运算或位操作,通常会将其转换为unsigned char

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

相关问题