Кодировка символов Objective-C - Измените char на int и обратно - PullRequest
1 голос
/ 17 декабря 2011

Простое задание: Мне нужно преобразовать два символа в два числа, сложить их вместе и заменить обратно на символ.
Что у меня есть: (отлично работает в Java - где кодирование обрабатывается для вас, я думаю):

int myChar1 = (int)([myText1 characterAtIndex:i]);
int myChar2 = (int)([myText2 characterAtIndex:keyCurrent]);
int newChar = (myChar1 + myChar2);
//NSLog(@"Int's %d, %d, %d", textChar, keyChar, newChar);
char newC = ((char) newChar);

NSString *tmp1 = [NSString stringWithFormat:@"%c", newC];
NSString *tmp2 = [NSString stringWithFormat:@"%@", newString];
newString = [NSString stringWithFormat:@"%@%@", tmp2, tmp1]; //Adding these char's in a string

Алгоритм идеален, но сейчас я не могу понять, как реализовать свойства кодирования. Я хотел бы сделать все в UTF-8, но понятия не имею, как, например, получить значение UTF-8 char. И если у меня есть, как изменить это значение обратно на char.
NSLog в коде выводит правильные значения. Но когда я пытаюсь сделать обратное с алгоритмом (т.е. - значения), то это идет не так. Он получает неправильное значение символа для странных / нечетных символов.

Ответы [ 3 ]

2 голосов
/ 17 декабря 2011

NSString работает с символами unichar длиной 2 байта (16 бит). Длина символа - один байт, поэтому вы можете хранить только кодовую точку от U+0000 до U+00FF (т. Е. Дополнения к базовой латинице и латинице-1).

Вы должны сделать математику для значений unichar, а затем использовать +[NSString stringWithCharacters:length:] для создания строкового представления.

Но есть проблема с этим решением. Ваш код может генерировать кодовые точки между U+D800 и U+DFFF, которые не являются допустимыми символами Юникода. Стандарт резервирует их для кодирования кодовых точек от U+10000 до U+10FFFF в UTF-16 парами 16-битных кодовых единиц. В таком случае ваша строка будет неправильно сформирована и не сможет быть отображена или преобразована в UTF8.

Кроме того, временная переменная tmp2 бесполезна, и вам не следует создавать новую строку newString при объединении строки, а использовать NSMutableString.

1 голос
/ 17 декабря 2011

Я предполагаю, что ваши строки - это строки NSS, состоящие из цифр, которые представляют число. Если это так, вы можете попробовать следующее:

Включите следующие заголовки:

#include <inttypes.h>
#include <stdlib.h>
#include <stdio.h>

Затем используйте следующий код:

// convert NSString to UTF8 string
const char * utf8String1 = [myText1 UTF8String];
const char * utf8String2 = [myText2 UTF8String];

// convert UTF8 string into long integers
long num1 = strtol(utf8String1, NULL 0);
long num2 = strtol(utf8String2, NULL 0);

// perform calculations
long calc = num1 - num2;

// convert calculated value back into NSString
NSString * calcText = [[NSString alloc] initWithFormat:@"%li" calc];

// convert calculated value back into UTF8 string
char calcUTF8[64];
snprintf(calcUTF8, 64, "%li", calc);

// log results
NSLog(@"calcText: %@", calcText);
NSLog(@"calcUTF8: %s", calcUTF8);
0 голосов
/ 17 декабря 2011

Не уверен, что это то, что вы имели в виду, но из того, что я понял, вы хотели создать строку NSString с кодировкой строки UTF-8 из символа?

Если это то, что вам нужно, возможно, вы можете использовать метод initWithCString:encoding: в NSString.

...