在Objective-C中使用像Python这样的原始字符串

时间:2010-01-28 02:32:03

标签: objective-c string

Objective-C有raw strings like Python's吗?

澄清:原始字符串不解释\n之类的转义序列:斜杠和“n”都是字符串中的单独字符。从链接的Python教程:

>>> print 'C:\some\name'  # here \n means newline!
C:\some
ame
>>> print r'C:\some\name'  # note the r before the quote
C:\some\name

6 个答案:

答案 0 :(得分:5)

Objective-C是C的超集。所以答案是肯定的。你可以写

char* string="hello world";

的任何地方。然后,您可以稍后通过

将其转换为NSString
NSString* nsstring=[NSString stringWithUTF8String:string];

答案 1 :(得分:4)

通过链接解释“原始字符串”的含义,答案是:没有内置的方法可以满足您的要求。

但是,您可以将一个字符串的出现替换为另一个字符串,因此您可以将@"\n"替换为@"\\n"。这应该让你接近你正在寻找的东西。

答案 2 :(得分:3)

您可以使用 stringize 宏。

#define MAKE_STRING(x) @#x

NSString *expendedString = MAKE_STRING(
hello world
"even quotes will be escaped"
);

预处理结果为

NSString *expendedString = @"hello world \"even quotes will be escaped\"";

如您所见,双引号被转义,但新行被忽略。 这个特性非常适合在Objective-C文件中粘贴一些JS代码。如果您使用的是 C99,则使用此功能是安全的。

来源:

答案 3 :(得分:2)

Objective-C是C的严格超集,因此您可以随意使用char *char[](如果这就是您所谓的原始字符串)。

答案 4 :(得分:2)

就像大家都说的那样,原始ANSI字符串非常简单。如果你想编译Objective C ++,只需使用简单的C字符串或C ++ std :: string。

但是,Cocoa的本机字符串格式是UCS-2 - 固定宽度的2字节字符。 NSStrings在内部存储为UCS-2,i。即作为unsigned short的数组。 (顺便说一句,就像在Win32和Java中一样。)该数据类型的系统范围别名是unichar和UniChar。这就是事情变得棘手的地方。

GCC包含一个wchar_t数据类型,允许您像这样定义一个原始的宽字符串常量:

wchar_t * ws = L“这是一个宽字符串。”;

但是,默认情况下,此数据类型定义为4字节int,因此与Cocoa的unichar不同!您可以通过指定以下编译器选项来覆盖它:

-fshort-WCHAR

但是你失去了宽字符C RTL函数(wcslen(),wcscpy()等) - RTL是在没有该选项的情况下编译的,并假定为4字节的wchar_t。手动重新实现这些功能并不是特别困难。你的电话。

一旦你有一个真正的2字节wchar_t原始字符串,你可以简单地将它们转换为NSStrings并返回:

wchar_t *ws = L"Hello";
NSString *s = [NSString stringWithCharacters:(const unichar*)ws length:5];

与所有其他[stringWithXXX]方法不同,此方法不涉及任何代码页转换。

答案 5 :(得分:1)

如果你的意思是C风格的字符串,那么是的。