2011-06-16 48 views
1

我們的代碼調用stringWithUTF8String,但我們有一些數據在字符串中使用了一個octal序列\ 340。這會導致一些代碼中斷,因爲我們從不期望函數返回nil。我做了一些研究,發現來自\ 200- \ 777的任何八進制序列都會得到相同的結果。我知道我可以處理這個返回nil,但我想明白爲什麼它會返回nil,以及那些八進制轉義解釋爲什麼。iOS某些八進制轉義序列導致nil for stringWithUTF8String

NSString *result = [NSString stringWithUTF8String:"Mfile \340 xyz.jpg"]; 

運行此代碼返回nil結果。看起來,爲了防守地編碼,我們必須在我們使用它的任何地方檢查空結果,這似乎是不幸的。該函數的文檔沒有提到任何有關返回nil的可能性。我敢打賭,那裏有很多代碼不會檢查它。

+0

我跑這個,它似乎提出'而不是'\ 140'標記而不是'nil'字符串。 – 2011-06-16 07:12:03

+0

對不起剪切和粘貼錯誤,我正在玩其他值。修復應該是\ 340不是\ 140 – possen 2011-06-16 16:25:19

+0

添加了一個答案。看一看。 – 2011-06-16 16:36:48

回答

0

我添加了一個被稱爲safeStringWithUTF8String類別:這就是所謂的無處不在,而不是簡單地檢查無返回值和返回空字符串,如果無效。不是很好,但不知道還有什麼要做,我們必須能夠處理傳入的任何數據。

0

如果您希望iOS將其作爲UTF-8處理,您必須確保它傳遞給它的有效UTF-8字符,因此您可能需要先將八進制字符轉換爲人類可讀的字符。

+0

這不起作用。該方法將C字符串作爲參數。 – 2011-06-16 07:50:38

+0

Oups,你是完全正確的 - 這來自鍵盤上的快速。 – 2011-06-16 08:43:36

2

UTF-8 Character Table沒有條目\340。您需要使用ASCII編碼。難道,

NSString * result = [NSString stringWithCString:"Mfile \340 xyz.jpg" encoding:NSASCIIStringEncoding]; 
NSLog(@"%@", result); 
相關問題