0

エスケープされたユニコードバージョンに変換する必要がある不要な文字を含む NSString があります。より具体的には、JSON オブジェクト (文字列としてシリアル化されたもの) をUIWebViewスクリプト評価メソッドを介して渡す必要があり、一部の文字は JS 例外を発生させる傾向があります。

したがって、JSLint によって安全でないと言及されているすべての文字をエンコードしたいと思います。

\u0000-\u001f
\u007f-\u009f
\u00ad
\u0600-\u0604
\u070f
\u17b4
\u17b5
\u200c-\u200f
\u2028-\u202f
\u2060-\u206f
\ufeff
\ufff0-\uffff

それらをエスケープされた同等のものに置き換えます。

これを行う最善の方法は何ですか?

更新: どういうわけか\u2028(行区切り文字) が JSON に忍び込みました

4

1 に答える 1

0

まあ、それは私が考えていた解決策ではありませんが、トリミングも適切なオプションです

  // Remove unsafe JSON characters
  //
  // http://www.jslint.com/lint.html#unsafe
  //
  if (jsonStr.length > 0) {
    NSMutableCharacterSet *unsafeSet = [NSMutableCharacterSet new];
    void (^addUnsafe)(NSInteger, NSInteger) = ^(NSInteger from, NSInteger to) {
      if (to > from) {
        [unsafeSet addCharactersInRange:NSMakeRange(from, (to - from) + 1)];
      } else {
        [unsafeSet addCharactersInRange:NSMakeRange(from, 1)];
      }          
    };

    addUnsafe(0x0000, 0x001f);
    addUnsafe(0x007f, 0x009f);
    addUnsafe(0x00ad, 0);
    addUnsafe(0x0600, 0x0604);
    addUnsafe(0x070f, 0);
    addUnsafe(0x17b4, 0);
    addUnsafe(0x17b5, 0);
    addUnsafe(0x200c, 0x200f);
    addUnsafe(0x2028, 0x202f);
    addUnsafe(0x2060, 0x206f);
    addUnsafe(0xfeff, 0);
    addUnsafe(0xfff0, 0xffff);

    jsonStr = [[jsonStr componentsSeparatedByCharactersInSet:unsafeSet] componentsJoinedByString:@""];
  }
于 2012-09-09T20:14:07.253 に答える