Когда я храню NSString в некотором NSDictionary и журнале что словарь к консоли как это:
NSString *someString = @"Münster";
NSDictionary *someDict = [ NSDictionary dictionaryWithObjectsAndKeys:
someString, @"thestring" ];
NSLog ( @"someDict: %@", [ someDict description ] );
Консольный вывод похож на это:
unicode_test[3621:903] someDict:
{
thestring = "M\U00fcnster";
}
с unicode символом строки, которого оставляют. Там какой-либо метод должен преобразовать NSString в это завершенное представление?
Проблему можно решить, используя цикл для представления данной строки в виде строки UniChar. Реализовано как расширение на NSString, оно будет выглядеть примерно так:
- (NSString *) escapedUnicode
{
NSMutableString *uniString = [ [ NSMutableString alloc ] init ];
UniChar *uniBuffer = (UniChar *) malloc ( sizeof(UniChar) * [ self length ] );
CFRange stringRange = CFRangeMake ( 0, [ self length ] );
CFStringGetCharacters ( (CFStringRef)self, stringRange, uniBuffer );
for ( int i = 0; i < [ self length ]; i++ ) {
if ( uniBuffer[i] > 0x7e )
[ uniString appendFormat: @"\\u%04x", uniBuffer[i] ];
else
[ uniString appendFormat: @"%c", uniBuffer[i] ];
}
free ( uniBuffer );
NSString *retString = [ NSString stringWithString: uniString ];
[ uniString release ];
return retString;
}
NSDictionary * someDict = [NSDictionary dictionaryWithObjectsAndKeys: someString, @ "thestring"];
Не забывайте ноль
часового. ;)
Вывод консоли выглядит так:
unicode_test [3621: 903] someDict: { thestring = "M \ U00fcnster"; } {{ 1}}
с экранированным символом Юникода строки.
Это все символы Unicode.
Есть ли какой-либо метод для преобразования NSString в это экранированное представление?
Это делает словарь (или какой-то частный метод NSPropertyListSerialization или частная функция CFPropertyList), а не строка. Последовательность \ U в этом выводе является частью формата OpenStep plist. Если вы выведете список в формате XML с помощью NSPropertyListSerialization, вы обнаружите, что ü (в настоящее время) закодирован как голый UTF-8.
Насколько мне известно, не существует встроенного метода, открытого или закрытого, который выполнял бы то же самое экранирование только для строки. Ближе всего к этому функция strvis
, но она работает побайтно; он не понимает Unicode или UTF.