2010-08-01 101 views
1

我在我的可可GUI中有一個字符串,它需要特殊的格式(字體,顏色等)。當然,我使用的是一個屬性字符串。爲了方便起見,我初始化字符串爲RTF:RTFString包含NSASCIIStringEncoding特殊字符?

NSString *inputString = @"This string has special characters"; 
NSString *rtfString = [NSString stringWithFormat:@"{@"***LENGTHY RTF FORMATTING STRING *** %@", inputString]; 
NSAttributedString *testString = [[NSAttributedString alloc] initWithRTF:[rtfString dataUsingEncoding:NSUTF8StringEncoding] documentAttributes:nil]; 

的問題是,在「inputString」可能有特殊字符,這是不正確顯示由於UTF8Encoding。它們被替換爲其他符號。 é保留爲Å©。

所以,現在我這樣做:

NSData* intermediateDataString=[inputString dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES]; 

inputString = [[[NSString alloc] initWithData:intermediateDataString encoding:NSUTF8StringEncoding] autorelease]; 

這不顯示意外字符,但它確實刪除所有口音和代替他們離開重音字母 - é留作e

這是一個改進,因爲一切都可以閱讀,但它是非常不理想。

想法?

回答

1

我會做這樣的事情。首先,創建一個虛擬屬性串:

NSString *dummyRTFString = @"***LENGTHY RTF FORMATTING STRING *** A"; 
NSAttributedString *dummyAS = [[NSAttributedString alloc] 
             initWithRTF:[rtfString dataUsingEncoding:NSUTF8StringEncoding] 
           documentAttributes:nil]; 

,並獲得屬性:

NSDictionary*attributes=[dummyAS attributesAtIndex:0 effectiveRange:NULL]; 
[dummyAS release]; 

現在,我將使用這個屬性來創建另一個屬性串:

NSAttributedString* as=[[NSAttributedString alloc] initWithString:inputString attributes:attributes]; 

另一種方法是使用HTML而不是RTF;那麼你可以在其中包含非ASCII字符作爲unicode。

+0

我更喜歡這個想法。我會嘗試一下。謝謝! – 2010-08-01 18:49:10

+0

美麗!像魅力一樣工作。多麼好的主意! – 2010-08-01 19:02:36

0

在你的第一行代碼中,我假設這真的是@"This string has special characters"否則你會得到一個編譯錯誤。它看起來像你的第二行有一個額外的@"

如果你知道你使用UTF-8,爲什麼說NSASCIIStringEncoding

真的,你應該把RTF包括帶有特殊字符的字符串放在一個資源中,而不是嵌入到你的代碼中。

+0

格式化的文本必須是動態的,但RTF是客戶端的顯示類型。 – 2010-08-01 18:47:06

+0

是的,有一個「@」,我混淆了一下...... – 2010-08-01 18:47:27