2014-01-06 84 views
4

我有一個Unicode字符串作爲轉換Unicode字符串到的NSString

{\rtf1\ansi\ansicpg1252\cocoartf1265 
{\fonttbl\f0\fswiss\fcharset0 Helvetica;\f1\fnil\fcharset0 LucidaGrande;} 
{\colortbl;\red255\green255\blue255;} 
{\*\listtable{\list\listtemplateid1\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{check\}}{\leveltext\leveltemplateid1\'01\uc0\u10003 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listname ;}\listid1}} 
{\*\listoverridetable{\listoverride\listid1\listoverridecount0\ls1}} 
\paperw11900\paperh16840\margl1440\margr1440\vieww22880\viewh16200\viewkind0 
\pard\li720\fi-720\pardirnatural 
\ls1\ilvl0 
\f0\fs24 \cf0 {\listtext  
\f1 \uc0\u10003 
\f0  }One\ 
{\listtext 
\f1 \uc0\u10003 
\f0  }Two\ 
} 

在這裏,我有Unicode數據\ u10003這相當於 「✓」 字。我已經使用 [NSString stringWithCharacters:「\ u10003」長度:NSUTF16StringEncoding]這是拋出編譯錯誤。請讓我知道如何將這些unicode字符轉換爲「✓」。

問候, 轟

+1

你做了Google ..?這裏是一個asnwer [轉換Unicode字符爲NSString](http://stackoverflow.com/questions/12090585/convert-unicode-character-to-nsstring) –

+0

對不起,我沒有得到任何東西在谷歌這一點。他們大多數有四位數字,這裏我們有五個數字。 – boom

+0

這就是[RTF](http://en.wikipedia.org/wiki/Rich_Text_Format)。你想用它做什麼? –

回答

6

我認爲:

  • 您是從文件或其他外部源讀取這個RTF數據。
  • 你正在解析它(不使用,例如,AppKit的內置RTF解析器)。
  • 你有一個原因,你自己解析它,而這個原因不是「等待,AppKit有內置?」。
  • 您在解析輸入時遇到了\u…,需要將其轉換爲字符以便進一步處理和/或包含在輸出文本中。
  • 你已經排除了\uc,這是一個不同的事情(它指定了遵循\u…序列的非Unicode字節數,如果我正確理解了RTF規範)。

\u後面跟着十六進制數字。你需要解析這些數字;該數字是序列表示字符的Unicode代碼點編號。然後您需要創建一個包含該字符的NSString。 (假設你已經掃描過\u本身),你可以直接詢問掃描器scanHexInt:。如果你使用NSScanner來解析輸入,那麼(假設你已經掃描過\u本身),你可以直接詢問掃描器scanHexInt:。傳遞一個指向變量unsigned int的指針。

如果您沒有使用NSScanner,那麼無論您是在解析它,請做任何有意義的事情。例如,如果您已將RTF數據轉換爲C字符串並正在通過它自己讀取,則需要使用strtoul來解析十六進制數字。它會在你指定的任何基地(在本例中爲16)中解釋數字,然後將指針指向任何你想要的下一個字符。

您的unsigned intunsigned long變量將包含指定字符的Unicode代碼點值。在你的問題的例子中,那將是0x10003或U + 10003。

現在,對於大多數字符,您可以簡單地將其分配給unichar變量,並從中創建NSString。這不會在這裏工作:unichar只能上升到0xFFFF,並且這個代碼點高於(在技術上說,它在基本多語言平面之外)。

幸運的是,* CF *字符串中有一個功能,以幫助您:

unsigned int codePoint = /*…*/; 

unichar characters[2]; 
NSUInteger numCharacters = 0; 
if (CFStringGetSurrogatePairForLongCharacter(codePoint, characters)) { 
    numCharacters = 2; 
} else { 
    characters[0] = codePoint; 
    numCharacters = 1; 
} 

然後可以使用stringWithCharacters:length:從這個數組的16位字符創建一個NSString。

3

使用此:

NSString *myUnicodeString = @"\u10003"; 

由於現代目的C.
讓我知道,如果不是你想要的。

+0

它不是1003,它是10003 – boom

+0

糾正... :) –

+0

這將無法正常工作。 '\ u'需要一個四位數字。你需要'\ U',它需要一個八位數字。 (當然,你必須用零填充)。此外,這個問題聽起來像提問者正在處理輸入,而不是(希望不會)在源代碼中嵌入固定的RTF字符串。 –

5

我用下面的代碼將Uniode字符串轉換爲NSString。這應該很好。

NSData *unicodedStringData = 
    [unicodedString dataUsingEncoding:NSUTF8StringEncoding]; 
    NSString *emojiStringValue = 
    [[NSString alloc] initWithData:unicodedStringData encoding:NSNonLossyASCIIStringEncoding]; 

在雨燕1.2

let theString1:NSString = "" 

let unicodedData:NSData = theString1.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true)! 

let emojiString = NSString(data: unicodedData, encoding: NSUTF8StringEncoding) 

enter image description here

+0

給定整個RTF數據,返回'nil'。假設單獨使用'\ u10003'序列,這會返回兩個字符(U + 1000後跟一個'3'),而不是一個。 https://gist.github.com/boredzo/8305377 –

+0

你能分享你如何編碼你的rtf字符串。我曾經將包含iOS Emojis字符的'NSString'編碼爲通過網絡傳輸的Unicode,並在顯示在我的應用程序中時獲取原始的'NSString'。這個技巧對我來說工作得很好 –

12

我有同樣的爲問題和下面的代碼解決了我的問題

對於編碼

NSData *dataenc = [yourtext dataUsingEncoding:NSNonLossyASCIIStringEncoding]; 
NSString *encodevalue = [[NSString alloc]initWithData:dataenc encoding:NSUTF8StringEncoding]; 

對於解碼

NSData *data = [yourtext dataUsingEncoding:NSUTF8StringEncoding]; 
NSString *decodevalue = [[NSString alloc] initWithData:data encoding:NSNonLossyASCIIStringEncoding]; 

感謝

+0

給定整個RTF數據,這返回'nil'。假設單獨使用'\ u10003'序列,這會返回兩個字符(U + 1000後跟一個'3'),而不是一個。 https://stackoverflow.com/questions/20943928/convert-unicode-string-to-nsstring/20980584#comment31523213_20944359 –

+1

我有一個unicode字符串的問題,您的解決方案可以幫助我找到問題,謝謝 –

-1
NSString *strUnicodeString = "\u2714"; 
NSData *unicodedStringData = [strUnicodeString dataUsingEncoding:NSUTF8StringEncoding]; 
NSString *emojiStringValue = [[NSString alloc] initWithData:unicodedStringData encoding:NSUTF8StringEncoding]; 
+0

請加上desciption – zohar

+0

@zohar,這段代碼只是將8位unicode字符更改爲字符串值。在這裏,我使用了代表複選標記的'\ u2714'unicode,只是我將該unicode更改爲字符串值,以表示代碼中的實際複選標記。 –