将unicode字符串转换为nsstring

 手机用户2502903761 发布于 2023-02-06 12:49

我有一个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字符转换为"✓".

此致,热潮

3 个回答
  • 我有同样的问题,以下代码解决了我的问题

    对于编码

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

    谢谢

    2023-02-06 12:50 回答
  • 我使用下面的代码将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)
    

    在此输入图像描述

    2023-02-06 12:50 回答
  • 我认为:

    您正在从文件或其他外部源读取此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;
    }
    

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

    2023-02-06 12:52 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有