NSString+RAJavascript.m 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. //
  2. // NSString+RAJavascript.m
  3. // APEX CRM
  4. //
  5. // Created by Jack on 2018/12/1.
  6. // Copyright © 2018年 USAI. All rights reserved.
  7. //
  8. #import "NSString+RAJavascript.h"
  9. @implementation NSString (RAJavascript)
  10. - (unsigned char)ra_hexCharFromInt:(int)value
  11. {
  12. if (value <= 9) return (unsigned char)(value + 48);
  13. return (unsigned char)((value - 10) + 97);
  14. }
  15. - (NSString *)ra_unicodeStringForChar:(unichar)ch
  16. {
  17. unsigned char uni[] = {
  18. [self ra_hexCharFromInt:((ch >> 12) & 0x0f)],
  19. [self ra_hexCharFromInt:((ch >> 8) & 0x0f)],
  20. [self ra_hexCharFromInt:((ch >> 4) & 0x0f)],
  21. [self ra_hexCharFromInt:(ch & 0x0f)],
  22. 0
  23. };
  24. return [NSString stringWithUTF8String:(char*)uni];
  25. }
  26. - (NSString *)ra_stringByEscapingForJavascriptWithDelimiter:(unichar)delimiter wrapWithDelimiters:(BOOL)wrap
  27. {
  28. NSMutableString *js = [[NSMutableString alloc] init];
  29. if (wrap)
  30. {
  31. [js appendFormat:@"%C", delimiter];
  32. }
  33. int lastWritePosition = 0;
  34. int skipped = 0;
  35. NSInteger length = self.length;
  36. unichar *chars = malloc(sizeof(unichar) * length);
  37. unichar c;
  38. [self getCharacters:chars range:NSMakeRange(0, length)];
  39. NSString *escapedValue;
  40. for (int i = 0; i < length; i++)
  41. {
  42. c = chars[i];
  43. switch (c)
  44. {
  45. case L'\t':
  46. escapedValue = @"\\t";
  47. break;
  48. case L'\n':
  49. escapedValue = @"\\n";
  50. break;
  51. case L'\r':
  52. escapedValue = @"\\r";
  53. break;
  54. case L'\f':
  55. escapedValue = @"\\f";
  56. break;
  57. case L'\b':
  58. escapedValue = @"\\b";
  59. break;
  60. case L'\\':
  61. escapedValue = @"\\\\";
  62. break;
  63. case 0x0085:
  64. escapedValue = @"\\u0085";
  65. break;
  66. case 0x2028:
  67. escapedValue = @"\\u2028";
  68. break;
  69. case 0x2029:
  70. escapedValue = @"\\u2029";
  71. break;
  72. case L'\'':
  73. escapedValue = (delimiter == L'\'') ? @"\\'" : nil;
  74. break;
  75. case L'"':
  76. escapedValue = (delimiter == '"') ? @"\\\"" : nil;
  77. break;
  78. default:
  79. escapedValue = (c <= 0x001f) ? [self ra_unicodeStringForChar:c] : nil;
  80. break;
  81. }
  82. if (escapedValue)
  83. {
  84. if (skipped > 0)
  85. {
  86. [js appendString:[self substringWithRange:NSMakeRange(lastWritePosition, skipped)]];
  87. skipped = 0;
  88. }
  89. [js appendString:escapedValue];
  90. lastWritePosition = i + 1;
  91. }
  92. else
  93. {
  94. skipped++;
  95. }
  96. }
  97. if (skipped > 0)
  98. {
  99. if (lastWritePosition == 0)
  100. {
  101. [js appendString:self];
  102. }
  103. else
  104. {
  105. [js appendString:[self substringWithRange:NSMakeRange(lastWritePosition, skipped)]];
  106. }
  107. }
  108. free(chars);
  109. if (wrap)
  110. {
  111. [js appendFormat:@"%C", delimiter];
  112. }
  113. return js;
  114. }
  115. @end