将unicode字符串转换为nsstring

boo*_*oom 4 unicode cocoa objective-c ios

我有一个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\
}
Run Code Online (Sandbox Code Playgroud)

这里我有unicode数据\ u10003,相当于"✓"字符.我使用了[NSString stringWithCharacters:"\ u10003"length:NSUTF16StringEncoding],这引发了编译错误.请告诉我如何将这些unicode字符转换为"✓".

此致,热潮

btm*_*dan 13

我有同样的问题,以下代码解决了我的问题

对于编码

NSData *dataenc = [yourtext dataUsingEncoding:NSNonLossyASCIIStringEncoding];
NSString *encodevalue = [[NSString alloc]initWithData:dataenc encoding:NSUTF8StringEncoding];
Run Code Online (Sandbox Code Playgroud)

用于解码

 NSData *data = [yourtext dataUsingEncoding:NSUTF8StringEncoding];
 NSString *decodevalue = [[NSString alloc] initWithData:data encoding:NSNonLossyASCIIStringEncoding];
Run Code Online (Sandbox Code Playgroud)

谢谢

  • 我在 unicode 字符串中有问题,您的解决方案帮助我找到了问题,谢谢 (2认同)

पवन*_*पवन 7

我使用下面的代码将Uniode字符串转换为NSString.这应该工作正常.

    NSData *unicodedStringData =
    [unicodedString dataUsingEncoding:NSUTF8StringEncoding];
    NSString *emojiStringValue =
    [[NSString alloc] initWithData:unicodedStringData encoding:NSNonLossyASCIIStringEncoding];
Run Code Online (Sandbox Code Playgroud)

在Swift 4中

 let emoji = ""
let unicodedData = emoji.data(using: String.Encoding.utf8, allowLossyConversion: true)
let emojiString = String(data: unicodedData!, encoding: String.Encoding.utf8)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


Pet*_*sey 6

我认为:

  • 您正在从文件或其他外部源读取此RTF数据.
  • 您正在自己解析它(而不是使用AppKit的内置RTF解析器).
  • 你有理由自己解析它,原因不是"等待,AppKit内置了吗?".
  • 您已经在\u…正在解析的输入中遇到并需要将其转换为字符以进一步处理和/或包含在输出文本中.
  • 你已经排除了\uc,这是一个不同的东西(\u…如果我正确理解了RTF规范,它指定序列后面的非Unicode字节数).

\u后跟十六进制数字.你需要解析那些数字; 该数字是序列表示的字符的Unicode代码点编号.然后,您需要创建包含该字符的NSString.

如果您正在使用NSScanner来解析输入,那么(假设您已经扫描过了\u自己),您可以简单地询问扫描仪scanHexInt:.传递指向unsigned int变量的指针.

如果您没有使用NSScanner,请执行任何有意义的操作,无论您正在解析它.例如,如果您已将RTF数据转换为C字符串并自行读取,则需要使用strtoul解析十六进制数字.它将解释您指定的任何基数(在本例中为16)中的数字,然后将指针指向下一个字符,无论您想要它.

然后,您的unsigned intunsigned long变量将包含指定字符的Unicode代码点值.在你的问题的例子中,那将是0x10003,或U + 10003.

现在,对于大多数字符,您可以简单地将其分配给unichar变量并从中创建NSString.这在这里不起作用:unichars只能达到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;
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用stringWithCharacters:length:此16位字符数组创建NSString.


Pri*_*wal 5

用这个:

NSString *myUnicodeString = @"\u10003"; 
Run Code Online (Sandbox Code Playgroud)

感谢现代的 Objective C。
如果它不是你想要的,请告诉我。