簡體   English   中英

C:非 ASCII 文本數據的 char 與 unsigned char

[英]C: char vs. unsigned char for non-ASCII text data

這個問題:

什么是無符號字符?

在 C 中很好地討論了charunsigned charsigned char。

但是,它沒有直接說明非 ASCII 文本應該使用什么。 因此,如果我有一個字節數組表示一些任意字符集中的文本,如 UTF-8 或 Big5(或有時是 ASCII),我應該使用char數組還是unsigned char數組?

我傾向於使用char ,否則 gcc 會在數組為 ASCII 且我使用strlen時向我發出有關指針符號的警告。 但我想知道什么是正確的。

使用普通字符表示字符。 如果您想要一個有符號整數類型,其值從-127 to +127 ,請使用有符號字符。 將unsigned char用於具有范圍為0 to 255的無符號整數類型。

您要問的問題可能比您預期的要廣泛得多。

為了直接回答,大多數實現都使用“字節”作為基礎緩沖區。 用這種說法,標准uint8_t typedef是您最好的選擇。 這主要是因為大多數字符集使用可變數量的字節來存儲字符,因此單獨的字節處理在編碼和解碼過程中至關重要。 它還簡化了不同“ endianess”之間的轉換。

通常,在ASCII編碼或其他單字節代碼頁(0-255范圍)以外的任何其他內容上使用strlen是不正確的。 在任何多字節編碼(例如Big5,UTF-8 / 16或Shift-JIS)上肯定是不正確的。

至於 UTF8 或 ASCII 字符具有相同代碼點的任何編碼, char是多字節字符串的最佳類型:

假設typedef char utf8

這是允許char *用作utf8 *而無需顯式轉換的唯一方法。 這是非常普遍的,也是比unsigned char更好的充分理由。

utf8 *可能會不小心傳遞給 function 期望指向 ASCII 字符序列的指針,但如果您需要 printf 您的 utf8 字符串(這是一件有效的事情),也可能需要這樣做

主要缺點是由於char符號未知,使用>等算術運算符是不安全的,檢查字符是否在 ASCII 范圍內的唯一安全方法是直接使用ISASCII(c) ((c & (1 << 7) == 0)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM