簡體   English   中英

將unicode字符串轉換為nsstring

[英]convert unicode string to nsstring

我有一個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…\u003c/code>在你解析,需要將其轉換成字符以便進一步處理和/或包含在輸出文本輸入。
  • 你已經排除了\\uc\u003c/code> ,這是一個不同的東西(如果我正確理解了RTF規范,它指定了跟在\\u…\u003c/code>序列之后的非Unicode字節數)。

\\u\u003c/code>后跟十六進制數字。 你需要解析那些數字; 該數字是序列表示的字符的Unicode代碼點編號。 然后,您需要創建包含該字符的NSString。

如果您正在使用NSScanner來解析輸入,那么(假設您已經掃過了\\u\u003c/code>本身),您可以簡單地要求掃描儀掃描scanHexInt: 將指針傳遞給unsigned int變量。

如果您沒有使用NSScanner,請執行任何有意義的操作,無論您正在解析它。 例如,如果您已將RTF數據轉換為C字符串並strtoul讀取它,則您將需要使用strtoul來解析十六進制數字。 它將解釋您指定的任何基數(在本例中為16)中的數字,然后將指針指向下一個字符,無論您想要它。

然后, unsigned intunsigned long變量將包含指定字符的Unicode代碼點值。 在你的問題的例子中,那將是0x10003 ,或U + 10003。

現在,對於大多數字符,您可以簡單地將其分配給unichar變量並從中創建NSString。 這在這里不起作用: unichar只能達到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。

用這個:

NSString *myUnicodeString = @"\u10003"; 

感謝現代目標C.
如果它不是你想要的,請告訴我。

NSString *strUnicodeString = "\u2714";  
NSData *unicodedStringData = [strUnicodeString dataUsingEncoding:NSUTF8StringEncoding];
NSString *emojiStringValue = [[NSString alloc] initWithData:unicodedStringData encoding:NSUTF8StringEncoding];

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM