![](/img/trans.png)
[英]How to convert a C string (char array) into a Python string when there are non-ASCII characters in the string?
[英]C: char vs. unsigned char for non-ASCII text data
這個問題:
在 C 中很好地討論了char與unsigned char與signed 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.