2014-01-06 82 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更改为字符串值,以表示代码中的实际复选标记。 –