我有一个unicode字符串
{\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"length:NSUTF16StringEncoding],这引发了编译错误.请告诉我如何将这些unicode字符转换为"✓".
此致,热潮
我有同样的问题,以下代码解决了我的问题
对于编码
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];
谢谢
我使用下面的代码将Uniode字符串转换为NSString.这应该工作正常.
NSData *unicodedStringData = [unicodedString dataUsingEncoding:NSUTF8StringEncoding]; NSString *emojiStringValue = [[NSString alloc] initWithData:unicodedStringData encoding:NSNonLossyASCIIStringEncoding];
在Swift 4中
let emoji = "" let unicodedData = emoji.data(using: String.Encoding.utf8, allowLossyConversion: true) let emojiString = String(data: unicodedData!, encoding: String.Encoding.utf8)
我认为:
您正在从文件或其他外部源读取此RTF数据.
您正在自己解析它(而不是使用AppKit的内置RTF解析器).
你有理由自己解析它,原因不是"等待,AppKit内置了吗?".
您已经在\u…
正在解析的输入中遇到并需要将其转换为字符以进一步处理和/或包含在输出文本中.
你已经排除了\uc
,这是一个不同的东西(\u…
如果我正确理解了RTF规范,它指定序列后面的非Unicode字节数).
\u
后跟十六进制数字.你需要解析那些数字; 该数字是序列表示的字符的Unicode代码点编号.然后,您需要创建包含该字符的NSString.
如果您正在使用NSScanner来解析输入,那么(假设您已经扫描过了\u
自己),您可以简单地询问扫描仪scanHexInt:
.传递指向unsigned int
变量的指针.
如果您没有使用NSScanner,请执行任何有意义的操作,无论您正在解析它.例如,如果您已将RTF数据转换为C字符串并自行读取,则需要使用strtoul
解析十六进制数字.它将解释您指定的任何基数(在本例中为16)中的数字,然后将指针指向下一个字符,无论您想要它.
然后,您的unsigned int
或unsigned long
变量将包含指定字符的Unicode代码点值.在你的问题的例子中,那将是0x10003
,或U + 10003.
现在,对于大多数字符,您可以简单地将其分配给unichar
变量并从中创建NSString.这在这里不起作用:unichar
s只能达到0xFFFF
,并且这个代码点高于那个(在技术术语中,它在Basic Multilingual Plane之外).
幸运的是,*CF*String有一个功能可以帮助您:
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.