2015-02-11 89 views
1

我遇到了一些在我的UILabel上顯示商標「TM」字符的問題。

問題出現的「TM」字符是\ U0099而不是通常的\ U2122
我深入挖掘並找出「TM」字符\ U0099屬於極少數中文字體。如何爲商標「TM」字符顯示或轉換(非標準) U0099?

所以我猜iOS沒有字體顯示它在標籤或根本不認識它。

我試圖掃描我的數據「\ U0099」和stringreplace它\ U2122,但好像NSString的功能將自動跳脫Unicode字符所以這次「以舊換新」字甚至不會在那裏。

有沒有人遇到過這個問題,或者可以給我一些關於如何處理這個\ U0099字符的建議?

預先感謝

+1

'\ U0099'不是一個有效的Unicode字符。'\ U0099'從哪裏來?爲什麼不使用正確的字符? – rmaddy 2015-02-11 04:02:58

+0

來自客戶端的數據庫。客戶端位於亞洲,所以我假設他們有很多中文數據。 [link](http://www.fileformat.info/info/unicode/char/0099/index.htm)我知道一個事實,你可以在其他語言的輸入法中使用不同的字符。例如「,」和「,」 – timlwting 2015-02-11 04:53:53

+1

Unicode是Unicode而不管語言或語言環境如何。 '\ U2122'是TM符號唯一的Unicode字符。這可能是因爲你的客戶端正在使用一些非Unicode(或非UTF)字符編碼,導致TM符號被編碼爲十六進制值爲'99',但它不會是'\ U0099'。如果你知道數據是什麼編碼,你可以簡單地使用適當的編碼從NSData中創建一個'NSString'。 – rmaddy 2015-02-11 05:00:58

回答

1

你是如何得到這我不清楚你NSString或者你有什麼真實目的是試圖解決您的問題。所以這個建議可能完全不合適,但讓我們看看它是否有幫助...

U + 0099是一個未分配的Unicode控制字符,它不是TM符號。如果將轉義符放入文字中,至少要將對象轉換爲,那麼很難將這個字符轉換成一個,否則Cocoa無法將UTF-8中的字節序列轉換爲NSString(如果它包含它)。這個問題可能是你的評論背後的問題,你無法將其替換爲字符串。

然而開始使用UTF-16,我還是設法在它創建與U + 0099的字符串:

unichar b[] = { 0x61, 0x62, 0x63, 0x99, 0x64, 0x65, 0x66 }; 
NSString *s = [[NSString alloc] initWithBytes:b length:14 encoding:NSUTF16LittleEndianStringEncoding]; 

也就是說字符串 「abc \ U0099def」(調用characterAtIndex:3會告訴你這個)。

使用相同的方法的NSString只有U + 0099在它可以產生:

和可在一個字符串中使用替換呼叫:

NSString *t = [s stringByReplacingOccurrencesOfString:notTMStr withString:@"™"]; 

給予t值根據需要「abc™def」。

警告:我們正在處理未分配的Unicode控制字符。 Clang/Cocoa以UTF-8拒絕它,它可能是無意的,它以UTF-16接受它。使用C庫函數來做到這一點可能更可靠。 Xcode 5.1.1和Clang 5.1被用於測試。

HTH

0

感謝您的建議。
我已經和我的客戶談過了,他們同意不應該在那裏。
我也實施了rmaddy的建議來將實例\ u0099替換爲\ u2122。

NSString *problemString = dictionaryWithU099AsValue.description; 
    if ([problemString rangeOfString:@"0099"].location != NSNotFound) { 
     NSString *fixedDescriptionString = [[[problemString stringByReplacingOccurrencesOfString:@"U0099" withString:@"U2122"]; 

    // Then I reconstruct the NSString back to a new NSDictionary 
    }