2011-05-02 109 views
0

我有一個isAlpha查找表。處理ASCII範圍外的字符

for (int i = 0; i <= UCHAR_MAX; ++i) 
p.isalphaLUT[i] = isalpha(i); 

其中isalphaLUT是字符數組...問題是isalphaLUT [I],其中i是ASCII範圍之外的字符,(它打印4294967168當我嘗試獲得等效ASCII值)。我嘗試設置127以上的所有ASCII碼範圍等於0,但這是行不通的。這個角色是這個ö。

+3

ASCII範圍是[0,127],而不是[0,255]。 – jamesdlin 2011-05-02 08:41:15

+0

我關心ASCII [0,255]。此刻ö應該在0到255的ASCII範圍內。但是,當我嘗試打印等價值時,我得到了一些無意義的數字,並且isalphaLUT [i]在我應該返回false時返回true – Jake 2011-05-02 08:43:05

+1

ASCII是0..127,而不是0..255,jamesdlin是對的。 – 2011-05-02 09:00:08

回答

2

測試某個字符是否爲字母的正確方法是測試它是否屬於字母類別之一:Lu,Ll,Lt,Lm或Lo。您可以使用IBM的ICU庫來執行此操作,它是一個非常受歡迎的用於處理Unicode的庫。

http://icu-project.org/apiref/icu4c/uchar_8h.html

您也可以直接使用u_isalpha功能從ICU,或u_charType,以確定字符的類別。請注意,術語「字母」比「alpha」更受歡迎,因爲Unicode中有許多非字母「字母」(如中文字符)。

但是,您必須先解碼字符。如果您使用的是數組char,那麼您的編碼可能是ASCII,LATIN-1,Windows 1252,UTF-8或任何其他編碼。如果直接訪問char,則可能會根據您的平臺進行簽名或未簽名,這就是爲什麼你會得到明顯錯誤的數字,如4294967168 - 這正是當字節0x80被解釋爲有符號char時發生的情況,然後投到unsigned int

使用查找表對於這類任務來說是一個非常糟糕的選擇,因爲表必須非常大 - 約700k。相反,我建議使用ICU或創建一個字符範圍表並在表中執行二進制搜索。這可能非常有效。

我正在創建一個工具來創建這些類型的表。該工具目前尚未準備好進行生產,但如果您喜歡冒險,則可以使用該工具,而自述文件中提供了有關如何使用該工具的示例。

https://github.com/depp/uniset

0

如何在使用索引數組之前檢查字符的值是否在範圍內?設置255以上的「所有ASCII範圍」(這是沒有意義的btw,所有我聽說的ASCII的定義都是單字節編碼)會導致一個相當巨大的查找表。

此外,ö確實是一個字母字符。你爲什麼不想像一個一樣處理它?

0

假設您使用默認語言環境,則對於字母A-Z和a-z,isalpha()函數將返回true,否則其他任何操作都會使其返回false。爲了進一步追求這一點,您需要了解字符編碼(如ASCII實際意味着什麼)和語言環境。