2014-01-06 4 views
4

У меня есть строка Юникодаконвертировать юникод строки NSString

{\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\ 
} 

Здесь я имею Юникод данные \ u10003, которое эквивалентно «✓» символы. Я использовал [NSString stringWithCharacters: "\ u10003" length: NSUTF16StringEncoding], который бросает ошибку компиляции. Пожалуйста, дайте мне знать, как преобразовать эти символы Unicode в «✓».

С уважением, Boom

+1

Вы сделали Google ..? вот один asnwer [Преобразование символа Unicode в NSString] (http://stackoverflow.com/questions/12090585/convert-unicode-character-to-nsstring) –

+0

Извините, я не могу ничего получить в Google для этого. Большинство из них имеют четырехзначное число, здесь у нас есть пять номеров. – boom

+0

Это [RTF] (http://en.wikipedia.org/wiki/Rich_Text_Format). Что именно вы хотите с этим сделать? –

ответ

6

Я предполагаю, что:

  • Вы читаете этот RTF данные из файла или другого внешнего источника.
  • Вы сами разбираете его (не используя, скажем, встроенный RTF-анализатор AppKit).
  • У вас есть причина, по которой вы разбираете ее самостоятельно, и эта причина не «ждать, у AppKit есть это встроенное?».
  • Вы столкнулись с \u… на входе, которое вы обрабатываете, и его необходимо преобразовать в символ для дальнейшей обработки и/или включения в выходной текст.
  • Вы исключили \uc, что совсем другое (оно указывает количество байтов, не относящихся к Юникоду, которые следуют за последовательностью \u…, если я правильно понял спецификацию RTF).

\u следует за шестнадцатеричными цифрами. Вам нужно разобрать их на число; это число является номером кодовой строки Юникода для символа, который представляет последовательность. Затем вам нужно создать NSString, содержащий этот символ.

Если вы используете NSScanner для синтаксического анализа ввода, то (при условии, что вы уже просмотрели \u), вы можете просто спросить сканер scanHexInt:. Передайте указатель на переменную unsigned int.

Если вы не используете NSScanner, делайте то, что имеет смысл, поскольку вы его разбираете. Например, если вы преобразовали данные RTF в строку C и читаете ее самостоятельно, вы должны будете использовать strtoul для разбора шестнадцатеричного номера. Он будет интерпретировать номер в любой базе, которую вы указали (в данном случае, 16), а затем поместите указатель на следующий символ, где хотите.

В переменной unsigned int или unsigned long переменная будет содержать значение кодовой точки Юникода для указанного символа. В примере с вашего вопроса будет 0x10003 или U + 10003.

Теперь для большинства символов вы можете просто назначить это переменной unichar и создать из нее NSString. Это не сработает здесь: unichar s только до 0xFFFF, и эта кодовая точка выше, чем это (в технических терминах это вне базовой многоязычной плоскости).

К счастью, * CF * Строка имеет функцию, чтобы помочь вам:

unsigned int codePoint = /*…*/; 

unichar characters[2]; 
NSUInteger numCharacters = 0; 
if (CFStringGetSurrogatePairForLongCharacter(codePoint, characters)) { 
    numCharacters = 2; 
} else { 
    characters[0] = codePoint; 
    numCharacters = 1; 
} 

Вы можете использовать stringWithCharacters:length: создать NSString из этого массива 16-битных символов.

3

Используйте это:

NSString *myUnicodeString = @"\u10003"; 

Благодаря современной Objective C.
Дай мне знать, если его не то, что вы хотите.

+0

это не 1003, это 10003 – boom

+0

исправлено ... :) –

+0

Это не сработает. '\ u' требует четырехзначное число. Вам понадобится '\ U', который принимает восьмизначное число. (Разумеется, вам нужно было бы обнулить нули.) Кроме того, вопрос звучит для меня, как вопросник обрабатывает ввод, а не (ну, надеюсь, нет) встраивание фиксированной строки RTF в исходный код. –

5

Я использовал ниже код для преобразования строки Uniode в NSString. Это должно работать нормально.

NSData *unicodedStringData = 
    [unicodedString dataUsingEncoding:NSUTF8StringEncoding]; 
    NSString *emojiStringValue = 
    [[NSString alloc] initWithData:unicodedStringData encoding:NSNonLossyASCIIStringEncoding]; 

В Swift 1.2

let theString1:NSString = "" 

let unicodedData:NSData = theString1.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true)! 

let emojiString = NSString(data: unicodedData, encoding: NSUTF8StringEncoding) 

enter image description here

+0

Учитывая все данные RTF, это возвращает 'nil'. С учетом последовательности '\ u10003' это возвращает два символа (U + 1000, за которым следует« 3 »), а не один. https://gist.github.com/boredzo/8305377 –

+0

Можете ли вы рассказать, как вы кодируете строку rtf. Я использовал для кодирования моего 'NSString', который содержал символы iOS Emojis для передачи Unicode по сети и возвращал исходный' NSString' при отображении внутри моего приложения. Этот трюк работал отлично для меня –

12

У меня же для задачи и следующий код решить мой вопрос

Для Encode

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

Благодаря

+0

Учитывая все данные RTF, это возвращает 'nil'. С учетом последовательности '\ u10003' это возвращает два символа (U + 1000, за которым следует« 3 »), а не один. https://stackoverflow.com/questions/20943928/convert-unicode-string-to-nsstring/20980584#comment31523213_20944359 –

+1

У меня проблема в строке юникода, ваше решение помогает мне найти проблему, спасибо –

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

Pleas add desciption – zohar

+0

@zohar, этот код просто меняет 8-битные символы юникода на строковое значение. Здесь я использовал unicode '\ u2714', который представляет галочку, просто я меняю этот unicode на строковое значение, чтобы представить фактический знак галочки в моем коде. –

Смежные вопросы