关于iOS中双引号的神坑

问题描述:

项目中,

1.textView的text必须不能以"开头,否则后台数据库会报error.

所以针对这情况,前端需要自行处理,用户输入的字符串不能以"开头。如果以"开头就删掉。


针对已经有双引号开头的字符串:

 NSString *oneStr;

   if (textView.text.length >0) {

           oneStr = [NSString stringWithFormat:@"%@",[textView.text substringToIndex:1]];

            if ([oneStr isEqualToString:@"\""] || [oneStr isEqualToString:@"\“"]) {

                      textView.text = [textView.text substringFromIndex:1];

       }    

}

针对开头输入的双引号:

 if (textView.text.length == 0 && string.length > 0) {//first char

         oneStr = [NSString stringWithFormat:@"%@",[string substringToIndex:1]];

         if ([oneStr isEqualToString:@"\""] || [oneStr isEqualToString:@"\“"]) {

                    string = [string substringFromIndex:1];

                     return NO;

             }

}

神坑就出现在调试的时候,用iPad输入”测试的时候,一直不会走第二段逻辑。

果断打断点用Po调试:

为啥false

这双引号看着都一样,可问啥就是不会进入此分支呢?

是不是中文的双引号有啥问题呢?继续测:

中文左右双引号

将log拷贝到其他编辑器中:

(lldb) po [textView.text subString:24 toIndex:25];

(lldb) po [textView.text subString:25 toIndex:26];

瞬间了然。

其实造成这个困惑的主要原因是Xcode中,中文输入法看起来不区分“”,如图:

Xcode中的双引号

鲁迅说过:搞清楚问题是解决问题的一半!

最终版本:

数组“”


为啥数组的后两个元素看着一样呢???  默念三遍:绝对不一样,绝对不一样,绝对不一样!以下为证:

 NSString*oneStr;

 NSArray*specialArray =@[@"\"",@"”",@"“"];//chinaChar” “

  if(textView.text.length>0) {

            textView.text = [textView.text stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];

            oneStr = [NSStringstringWithFormat:@"%@",[textView.textsubstringToIndex:1]];  

             if([specialArraycontainsObject:oneStr]) {

                     textView.text= [textView.textsubstringFromIndex:1];

             }

   }

 if (range.location == 0 && string.length > 0) {

          if(string.length>0) {

                     oneStr = [NSStringstringWithFormat:@"%@",[stringsubstringToIndex:1]];

                     if([specialArraycontainsObject:oneStr]) {

                                string = [stringsubstringFromIndex:1];

                     returnNO;

              }

        }

}


总结:

1.在用subStringtoIndex:方法之前,最好去除一下String开头的空格,因为用户可能会无意中多输入一个空格。

2.如何定位textView中的是首个字符?应该用range.location == 0来判断,而不是textView.text.length == 0。因为用户完全可能手动移动光标。

推荐阅读更多精彩内容