32+ (instancetype) stringWithContentsOfUnicodeFile:(NSString *)path
37 const uint8_t *bytes = NULL;
39 const uint8_t *effectiveBytes = NULL;
40 size_t effectiveLength = 0;
42 data = [[
NSData oo_dataWithOXZFile:path] retain];
43 if (data ==
nil) OK = NO;
47 length = [
data length];
51 if (OK && 2 <= length && (length %
sizeof(unichar)) == 0)
54 unichar firstChar = bytes[0];
55 firstChar = (firstChar << 8) | bytes[1];
56 if (firstChar == 0xFFFE || firstChar == 0xFEFF)
59 result = [
NSString stringWithCharacters:(unichar *)(bytes + sizeof(unichar)) length:(length / sizeof(unichar)) - 1];
60 if (result ==
nil) OK = NO;
64 if (OK && result ==
nil)
67 if (3 <= length && bytes[0] == 0xEF && bytes[1] == 0xBB && bytes[2] == 0xBF)
70 effectiveBytes = bytes + 3;
71 effectiveLength = length + 3;
75 effectiveBytes = bytes;
76 effectiveLength = length;
80 result = [[[
NSString alloc] initWithBytes:effectiveBytes length:effectiveLength encoding:NSUTF8StringEncoding] autorelease];
83 if (OK && result ==
nil)
86 result = [[[
NSString alloc] initWithBytes:effectiveBytes length:effectiveLength encoding:NSISOLatin1StringEncoding] autorelease];
110- (NSData *) utf16DataWithBOM:(BOOL)includeByteOrderMark
112 size_t lengthInChars;
113 size_t lengthInBytes;
114 unichar *buffer = NULL;
115 unichar *characters = NULL;
118 lengthInChars = [
self length];
119 lengthInBytes = lengthInChars *
sizeof(unichar);
120 if (includeByteOrderMark) lengthInBytes +=
sizeof(unichar);
123 buffer = malloc(lengthInBytes);
124 if (buffer == NULL)
return nil;
128 if (includeByteOrderMark)
130 *characters++ = 0xFEFF;
134 [
self getCharacters:characters];
137 return [
NSData dataWithBytesNoCopy:buffer length:lengthInBytes freeWhenDone:YES];
153- (NSString *)stringByTrimmingLeadingCharactersInSet:(NSCharacterSet *)characterSet
155 NSRange rangeOfFirstWantedCharacter = [
self rangeOfCharacterFromSet:[
characterSet invertedSet]];
156 if (rangeOfFirstWantedCharacter.location == NSNotFound)
return @"";
158 return [
self substringFromIndex:rangeOfFirstWantedCharacter.location];
168- (NSString *)stringByTrimmingTrailingCharactersInSet:(NSCharacterSet *)characterSet
170 NSRange rangeOfLastWantedCharacter = [
self rangeOfCharacterFromSet:[
characterSet invertedSet] options:NSBackwardsSearch];
171 if (rangeOfLastWantedCharacter.location == NSNotFound)
return @"";
173 return [
self substringToIndex:rangeOfLastWantedCharacter.location+1];