Objective c 如何取消macOS上的反斜杠?

Objective c 如何取消macOS上的反斜杠?,objective-c,swift,macos,nsstring,Objective C,Swift,Macos,Nsstring,本地化的.strings文件可能包含转义字符,如\n和\“ 我怎样才能有效地摆脱他们 我知道我可以编写自己的函数,查找\并删除它,然后继续搜索下一个字符(这样我就不会将\\变为零),但这不会处理特殊的转义方法,例如八进制字符数(例如,LF的\012)和可能的其他形式 我想,NSString会为此提供一个函数,但我找不到任何函数 事实上,这似乎是一个重复的问题,但该问题有很多错误答案,没有一个正确答案。而且用户不再活跃,这意味着没有人会在那里接受正确答案。在这种情况下该如何处理?这是一个自写的Ob

本地化的.strings文件可能包含转义字符,如
\n
\“

我怎样才能有效地摆脱他们

我知道我可以编写自己的函数,查找
\
并删除它,然后继续搜索下一个字符(这样我就不会将
\\
变为零),但这不会处理特殊的转义方法,例如八进制字符数(例如,LF的
\012
)和可能的其他形式

我想,
NSString
会为此提供一个函数,但我找不到任何函数


事实上,这似乎是一个重复的问题,但该问题有很多错误答案,没有一个正确答案。而且用户不再活跃,这意味着没有人会在那里接受正确答案。在这种情况下该如何处理?

这是一个自写的ObjC版本,适用于大多数情况。它定义了一个
未被替换的方法

#导入
@接口字符串(反斜杠)
-(NSString*)未被替换;
@结束
@实现NSString(反斜杠)
-(NSString*)未被替换
{
NSString*text=self;
NSInteger-charIndex=0;
while(true){
NSInteger textLen=text.length;
如果(charIndex>=textLen){
打破
}
NSRange remainingRange=NSMakeRange(charIndex,textLen charIndex);
NSRange charRange=[字符串的文本范围:@“\\”选项:0范围:remainingRange];
if(charRange.length==0){
//不再使用反斜杠->完成
打破
}
charIndex=charRange.location+1;
如果(charIndex>=textLen){
//已到达字符串结尾->退出循环
打破
}
//检查反斜杠后面的字符
unichar nextChar=[文本字符索引:charIndex];
unichar替换字符;
NSInteger-skipLen=1;
如果(nextChar>='a'&&nextChar=textLen)中断;
//注意:不确保两个字符都是有效的十六进制字符
NSString*code=[文本子字符串WithRange:NSMakeRange(charIndex+1,2)];
char ch=strtol(code.UTF8String,NULL,16);
replacementChar=ch;
skipLen+=xtraLen;
}else if(nextChar=='u'){
//unicode字符码
const NSInteger xtraLen=4;
如果(charIndex+xtraLen>=textLen)中断;
//注意:不确保所有四个字符都是有效的十六进制字符
NSString*code=[文本子字符串WithRange:NSMakeRange(charIndex+1,4)];
unichar ch=strtol(code.UTF8String,NULL,16);
replacementChar=ch;
skipLen+=xtraLen;
}否则{
//未知转义码-应修复此问题
NSAssert(错误,@“逃逸\\%c的案例丢失”,下一步);
}
}else如果(nextChar>='0'&&nextChar textLen){//获取第二个八进制字符
nextChar2=[text characterAtIndex:charIndex+1];
}
如果(nextChar=='0'&&(nextChar2<'0'| | nextChar2>'9')){
//短NUL(\0)字符
replacementChar=0;
}否则{
//八进制字符码
const NSInteger xtraLen=2;
如果(charIndex+xtraLen>=textLen)中断;
//注意:不确保最后一个字符是有效的八进制字符
NSString*code=[text substringWithRange:NSMakeRange(charIndex,3)];
char ch=strtol(code.UTF8String,NULL,8);//https://stackoverflow.com/a/12820646/43615
replacementChar=ch;
skipLen+=xtraLen;
}
}否则{
//处理所有常规转义,如\\和\“
replacementChar=nextChar;
}
#如果0//请使用字符串连接
charIndex+=skipLen-1;
NSString*head=[text substringToIndex:charRange.location];
NSString*tail=[text substringfromfromindex:charIndex+1];
text=[NSString stringWithFormat:@“%@%C%@”,开头,替换字符,结尾];
#else//使用可变字符串
if(text==self){
text=text.mutableCopy;
}
NSRange replacedRange=NSMakeRange(charRange.location,skipLen+1);
NSString*replacement=[NSString stringWithCharacters:&replacementChar长度:1];
[(NSMutableString*)文本替换字符范围:replacedRange with字符串:replacement];
charIndex+=1;
#恩迪夫
}
返回文本;
}
@结束
int main(int argc,const char*argv[]{
@自动释放池{
NSArray*测试值=@[
@“CR:\\rLF:\\n”,
@“\\\”引用的\\\\”,
@“反斜杠:\\\”,
@“八进制x(\170):\\170”,
@“十六进制x(\x78):\\x78”,
@“UnicodeФ(\u0424):\\u0424”,
@“NUL char:\\0。”,
@“错误十六进制:\\x7x”,//未检测到无效
@“坏十六进制:\\x7”,
@“不完整:\\13”
];
for(TestValue中的NSString*s){
NSString*s2=[NSString stringWithFormat:@“已转义:%@\n未转义:%@”,s,s.unescaped];
printf(“\n%s\n”,s2.UTF8String);
}
}
返回0;
}