27#ifndef OOENCODINGCONVERTER_EXCLUDE
42#define USE_COMPATIBILITY_MAPPING 0
44#define USE_COMPATIBILITY_MAPPING 0
48#define PROFILE_ENCODING_CONVERTER 0
54#if PROFILE_ENCODING_CONVERTER
56static NSTimer *sProfileTimer =
nil;
58static unsigned sCacheHits = 0;
59static unsigned sCacheMisses = 0;
63@interface OOEncodingConverter (Private)
65- (NSData *) performConversionForString:(NSString *)string;
72- (id) initWithEncoding:(NSStringEncoding)encoding substitutions:(NSDictionary *)substitutions
77 _cache = [[
OOCache alloc] init];
78 [_cache setPruneThreshold:kCachePruneThreshold];
79 [_cache setName:@"Text encoding"];
80 _substitutions = [substitutions copy];
83#if PROFILE_ENCODING_CONVERTER
84 if (sProfiledConverter ==
nil)
86 sProfiledConverter =
self;
87 sProfileTimer = [NSTimer scheduledTimerWithTimeInterval:5 target:self selector:@selector(profileFire:) userInfo:nil repeats:YES];
96- (id) initWithFontPList:(NSDictionary *)fontPList
98 return [
self initWithEncoding:EncodingFromString([fontPList oo_stringForKey:@"encoding"]) substitutions:[fontPList oo_dictionaryForKey:@"substitutions"]];
105 [_substitutions release];
107#if PROFILE_ENCODING_CONVERTER
108 sProfiledConverter =
nil;
109 [sProfileTimer invalidate];
119- (NSString *) descriptionComponents
121 return [NSString stringWithFormat:@"encoding: %u", _encoding];
125- (NSData *) convertString:(NSString *)string
129#if USE_COMPATIBILITY_MAPPING
131 string = [string precomposedStringWithCompatibilityMapping];
134 if (
string ==
nil)
return [NSData data];
136 data = [_cache objectForKey:string];
139 data = [
self performConversionForString:string];
140 if (data !=
nil) [_cache setObject:data forKey:string];
142#if PROFILE_ENCODING_CONVERTER
155- (NSStringEncoding) encoding
163@implementation OOEncodingConverter (Private)
165- (NSData *) performConversionForString:(NSString *)string
167 NSString *subst =
nil;
168 NSMutableString *
mutable =
nil;
170 mutable = [[string mutableCopy] autorelease];
171 if (
mutable ==
nil)
return nil;
175 [mutable replaceOccurrencesOfString:subst
176 withString:[_substitutions objectForKey:subst]
178 range:NSMakeRange(0, [mutable length])];
181 return [mutable dataUsingEncoding:_encoding allowLossyConversion:YES];
185#if PROFILE_ENCODING_CONVERTER
193- (void) profileFire:(
id)junk
195 float ratio = (float)sCacheHits / (
float)(sCacheHits + sCacheMisses);
196 OOLog(
@"strings.encoding.profile",
@"Cache hits: %u, misses: %u, ratio: %.2g", sCacheHits, sCacheMisses, ratio);
197 sCacheHits = sCacheMisses = 0;
216#define kWindowsLatin1Str @"windows-latin-1"
217#define kWindowsLatin2Str @"windows-latin-2"
218#define kWindowsCyrillicStr @"windows-cyrillic"
219#define kWindowsGreekStr @"windows-greek"
220#define kWindowsTurkishStr @"windows-turkish"
227 case NSWindowsCP1252StringEncoding:
230 case NSWindowsCP1250StringEncoding:
233 case NSWindowsCP1251StringEncoding:
236 case NSWindowsCP1253StringEncoding:
239 case NSWindowsCP1254StringEncoding:
250 if ([name isEqualToString:
kWindowsLatin1Str])
return NSWindowsCP1252StringEncoding;
251 if ([name isEqualToString:
kWindowsLatin2Str])
return NSWindowsCP1250StringEncoding;
253 if ([name isEqualToString:
kWindowsGreekStr])
return NSWindowsCP1253StringEncoding;
255 return (NSStringEncoding)NSNotFound;
#define foreachkey(VAR, DICT)
#define kWindowsCyrillicStr
static const NSUInteger kCachePruneThreshold
#define kWindowsLatin1Str
NSStringEncoding EncodingFromString(NSString *name)
#define kWindowsLatin2Str
NSString * StringFromEncoding(NSStringEncoding encoding)
#define kWindowsTurkishStr
#define OOLog(class, format,...)