我正在使用CFStringTokenizer將文本加載到單詞中,但我無法橋接CFString使用的任何編碼和UTF8。試想一下:CFStringTokenizer UTF8 C字符串的令牌範圍
NSString *theString = @"Lorem ipsum dolor sit amet!";
const char *theCString = [theString cStringUsingEncoding:NSUTF8StringEncoding];
tokenizer = CFStringTokenizerCreate(kCFAllocatorDefault,
(__bridge CFStringRef)theString,
CFRangeMake(0, [theString length]),
kCFStringTokenizerUnitWordBoundary,
locale);
while ((tokenType = CFStringTokenizerAdvanceToNextToken(tokenizer)) != kCFStringTokenizerTokenNone) {
tokenRange = CFStringTokenizerGetCurrentTokenRange(tokenizer);
memcpy(resultPtr, theCString+tokenRange.location, tokenRange.length);
}
不幸的是試圖如果遇到了任何非ASCII字符從C字符串讀出時的標記生成報告的範圍不正確。我怎樣才能從標記器獲得正確的範圍以便能夠從我的C字符串中提取正確的字符?
爲了說明,memcpy的東西比上面的要複雜得多,而且是我的目標設備iPhone上的性能所必需的。所以我什至不能做像創建一個CFString子字符串和轉換,我需要在C字符串的範圍。有沒有辦法做到這一點,而不重新實現各種文字邊界庫,以使它適用於我需要的各種不同語言環境? (這是儘可能多的,所以我不能只是通過尋找「」不幸的是迭代..)
亞歷克
感謝彼得,我已經使用getBytes現在和範圍問題的排序。我想避免使用這種方法,因爲它在iPhone上增加了很多開銷,現在這個算法花費了大約60%的時間,其餘的工作並不是微不足道的。遺憾的是,getBytes沒有「NoCopy」變體(我意識到這一點),所以我認爲我已經走到了關於優化的道路盡頭.. – Max 2011-12-29 05:22:25
@Alec:你可能想問另一個問題這表明您打算如何處理UTF-8數據。 – 2011-12-29 11:43:00