【问题标题】:Why short* instead of char* for string? Difference between char* and unsigned char*?为什么用 short* 而不是 char* 来表示字符串? char* 和 unsigned char* 的区别?
【发布时间】:2012-03-06 21:52:39
【问题描述】:

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

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

1.问题

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

2。问题

我只看到char* 必须存储字符串。那我什么时候应该使用unsigned char*,还是没有任何区别?

【问题讨论】:

  • short 是 2 个字节的类型,而 char 是 1 个字节的类型。我不知道为什么 SDK 使用 short* 指向一个字符串。你确定是吗?
  • @Eregrith short 不保证是两个字节宽。
  • @Eregrith typedef UInt16 UniChar;,与UniChar* someString;类似。
  • @NiklasR,你应该告诉我们这是 UniChar,而不仅仅是 unsigned short*。并且应该自己多考虑一下:)
  • @NiklasR 那么 UniChar 表示 unicode char,那么对于某些语言,您需要 2 个字节。

标签: c character-encoding char unsigned short


【解决方案1】:

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 位实体。

【讨论】:

    【解决方案2】:

    1.问题 - 答案

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

    2。问题 - 答案

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

    【讨论】:

      【解决方案3】:
      1. 可能是使用 UTF-16 字符串的轻率尝试。 C 有一个wide character 类型,wchar_t,它的chars(或wchar_ts)可以是 16 位长。虽然我对 SDK 不够熟悉,无法说出他们究竟为什么要走这条路,但它可能是为了解决编译器问题。在 C99 中有更合适的 [u]int[least/fast]16_t 类型 - 请参阅 <stdint.h>

        请注意,C 对数据类型及其底层大小几乎没有保证。有符号或无符号的 short 不保证为 16 位(尽管它们保证至少有那么多),字符也不限于 8 位或宽字符 16 或 32。

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

      2. 实际上并没有什么不同。如果您想对字符进行(无符号)算术或位操作,通常会转换为 unsigned char

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

      【讨论】:

        猜你喜欢
        • 2014-05-03
        • 1970-01-01
        • 1970-01-01
        • 2020-10-08
        • 1970-01-01
        • 2016-07-07
        • 1970-01-01
        • 2012-03-02
        • 2023-02-10
        相关资源
        最近更新 更多