2012-02-15 62 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數據。這是完全合理的。

相關問題