我有一个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字符转换为“✓”。
此致,热潮
我认为:
\u…
,需要将其转换为字符以进一步处理和/或包含在输出文本中。\uc
,这是一个不同的东西(如果我正确理解RTF规范,它指定了\u…
序列之后的非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。
我有同样的问题,以下代码解决了我的问题
对于编码
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)
用这个:
NSString *myUnicodeString = @"\u10003";
感谢现代目标C. 如果它不是你想要的,请告诉我。
NSString *strUnicodeString = "\u2714";
NSData *unicodedStringData = [strUnicodeString dataUsingEncoding:NSUTF8StringEncoding];
NSString *emojiStringValue = [[NSString alloc] initWithData:unicodedStringData encoding:NSUTF8StringEncoding];