Обнаружение символов Юникода в NSString на iPhone - PullRequest
8 голосов
/ 10 ноября 2009

Я работаю над приложением SMS для iPhone. Мне нужно определить, вводил ли пользователь какие-либо символы Юникода внутри строки NSS, которую он хочет отправить.

Мне нужно сделать это потому, что символы Юникода занимают больше места в сообщении, а также потому, что мне нужно преобразовать их в шестнадцатеричные эквиваленты.

Поэтому мой вопрос заключается в том, как мне обнаружить присутствие символа Unicode в строке NSString (которую я читаю из UITextView). Кроме того, как мне затем преобразовать эти символы в их шестнадцатеричные эквиваленты UCS ‑ 2?

Eg 繁 = 7E41, 体 = 4F53, 中 = 4E2D, 文 = 6587

Ответы [ 2 ]

25 голосов
/ 10 ноября 2009

Чтобы проверить только символы ascii (или другую выбранную вами кодировку), используйте:

[myString canBeConvertedToEncoding: NSASCIIStringEncoding];

Возвращается NO, если строка содержит символы не ascii. Затем вы можете преобразовать строку в данные UCS-2 с помощью:

[myString dataUsingEncoding: NSUTF16BigEndianStringEncoding];

или NSUTF16LittleEndianStringEncoding в зависимости от вашей платформы. Есть небольшие различия между UCS-2 и UTF-16. UTF-16 вытеснил UCS-2. Вы можете прочитать о различиях здесь:

http://en.wikipedia.org/wiki/UTF-16/UCS-2

0 голосов
/ 07 ноября 2010

Я не мог заставить это работать.

У меня есть строка html с   НЕ ПРОРЫВАЯ ПРОБЕЛ

</div>Great Guildford St/SouthwarkSt & nbsp;Stop:& nbsp; BM<br>Walk to SE1 0HL<br>
 "Great Guildford St/SouthwarkSt \U00a0Stop:\U00a0 BM",

Я пробовал 3 типа кодирования / декодирования

// NSData   *asciiData   = [instruction dataUsingEncoding:NSUTF16BigEndianStringEncoding];                                          
// NSString *asciiString = [[NSString alloc] initWithData:asciiData 
//     encoding:NSUTF16BigEndianStringEncoding];

// NSData   *asciiData   = [instruction dataUsingEncoding:NSASCIIStringEncoding];                                           
// NSString *asciiString = [[NSString alloc] initWithData:asciiData 
//     encoding:NSASCIIStringEncoding];

//little endian
NSData   *asciiData   = [instruction dataUsingEncoding:NSUTF16LittleEndianStringEncoding];                                          
NSString *asciiString = [[NSString alloc] initWithData:asciiData
    encoding:NSUTF16LittleEndianStringEncoding];

ничего из этого не сработало. Казалось, они работают, как будто я NSLog строку выглядит нормально

NSLog(@"HAS UNICODE  :%@", instruction); 
..do encode/decode
NSLog(@"UNICODE AFTER:%@", asciiString);

Какой вывод

HAS UNICODE: St/SouthwarkSt  Stop:  BM
UNICODE AFTER: St/SouthwarkSt  Stop:  BM

но я случайно сохранил их в NSArray, и мне пришлось позвонить [stringArray description], и весь юникод все еще был там

instructionsArrayString: (
    "Great Guildford St/SouthwarkSt \U00a0Stop:\U00a0 BM",
    "Walk to SE1 0HL"
)

Итак, что-то в NSLog скрывает &nbsp;, но это отображается в описании NSArray, так что вы можете подумать, что вы удалили Unicode, когда вы этого не сделали.

Попробую другой метод, который заменит символы.

...