将unicode字符串转换为nsstring

问题描述 投票:4回答:5

我有一个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字符转换为“✓”。

此致,热潮

ios objective-c cocoa unicode
5个回答
6
投票

我认为:

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

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


13
投票

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

对于编码

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];

谢谢


6
投票

我使用下面的代码将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)

enter image description here


3
投票

用这个:

NSString *myUnicodeString = @"\u10003"; 

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


-1
投票
NSString *strUnicodeString = "\u2714";  
NSData *unicodedStringData = [strUnicodeString dataUsingEncoding:NSUTF8StringEncoding];
NSString *emojiStringValue = [[NSString alloc] initWithData:unicodedStringData encoding:NSUTF8StringEncoding];
© www.soinside.com 2019 - 2024. All rights reserved.