Skip to content

Commit 19d4c1e

Browse files
committed
Merge pull request #1 from waynezhang/master
Fix encoding issue for CJK files
2 parents 0a53fe8 + 6799166 commit 19d4c1e

File tree

4 files changed

+42
-7
lines changed

4 files changed

+42
-7
lines changed

SCStringsUtility/Others/NSString+SCAdditions.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,7 @@
1414

1515
- (NSString*)stringByTrimmingLeadingWhiteSpaces;
1616
- (NSString*)stringByTrimmingTralingWhiteSpaces;
17+
18+
+ (BOOL)detectFileEncoding:(NSStringEncoding *)encoding path:(NSString *)path error:(NSError **)error;
19+
1720
@end

SCStringsUtility/Others/NSString+SCAdditions.m

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,4 +51,28 @@ - (NSString*)stringByTrimmingTralingWhiteSpaces
5151
return [self stringByReplacingCharactersInRange:range withString:@""];
5252
}
5353

54+
+ (BOOL)detectFileEncoding:(NSStringEncoding *)encoding path:(NSString *)path error:(NSError **)error
55+
{
56+
NSString *string = [NSString stringWithContentsOfFile:path usedEncoding:encoding error:error];
57+
if (string != nil) {
58+
if (*encoding == NSUTF16StringEncoding) {
59+
// fix for little endian
60+
NSFileHandle *fileHandle = [NSFileHandle fileHandleForReadingAtPath:path];
61+
[fileHandle seekToFileOffset:0];
62+
NSData *data = [fileHandle readDataOfLength:2];
63+
const char *head = [data bytes];
64+
if (*head == '\xFF' && *(head + 1) == '\xFE') {
65+
*encoding = NSUTF16LittleEndianStringEncoding;
66+
}
67+
[fileHandle closeFile];
68+
}
69+
70+
return YES;
71+
} else {
72+
SCLog(@"Possible problem in detecting encoding %@", *error);
73+
74+
return NO;
75+
}
76+
}
77+
5478
@end

SCStringsUtility/Readers&Writers/SCReader.m

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,10 @@ - (id)initWithPath:(NSString*)path
4040
fileHandle = [NSFileHandle fileHandleForReadingAtPath:self.filePath];
4141
if (fileHandle == nil) return nil;
4242

43-
NSError *error;
44-
[NSString stringWithContentsOfFile:self.filePath usedEncoding:&encoding error:&error];
45-
if(error) SCLog(@"Possible problem in detecting encoding %@",error);
43+
if (![NSString detectFileEncoding:&encoding path:filePath error:nil]) {
44+
// fallback
45+
encoding = NSUTF8StringEncoding;
46+
}
4647

4748
lineDelimiter = @"\n";
4849
filePath = path;
@@ -58,8 +59,8 @@ - (id)initWithPath:(NSString*)path
5859
- (NSString *)readLine
5960
{
6061
if (currentOffset >= totalFileLength) { currentOffset = 0ULL; currentLine = 0; return nil; }
61-
62-
NSData * newLineData = [lineDelimiter dataUsingEncoding:NSUTF8StringEncoding];
62+
63+
NSData * newLineData = [lineDelimiter dataUsingEncoding:self.encoding];
6364
[fileHandle seekToFileOffset:currentOffset];
6465
NSMutableData * currentData = [[NSMutableData alloc] init];
6566
BOOL shouldReadMore = YES;

SCStringsUtility/Readers&Writers/SCStringsWriter.m

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,13 @@
1313
@interface SCStringsWriter ()
1414
@property (nonatomic, strong) NSMutableDictionary *fileHandlers;
1515
@property (nonatomic, strong) NSArray *headers;
16+
@property(nonatomic, assign) NSStringEncoding fileEncoding;
1617
@end
1718

1819
@implementation SCStringsWriter
1920
@synthesize fileHandlers;
2021
@synthesize headers;
22+
@synthesize fileEncoding;
2123

2224
- (id)initWithHeaders:(NSArray *)heads
2325
{
@@ -42,6 +44,11 @@ - (id)initWithTranslationFiles:(NSDictionary *)files
4244
{
4345
NSFileHandle *fileHandle = [NSFileHandle fileHandleForWritingAtPath:[x objectForKey:@"Path"]];
4446
if(fileHandle == nil) {SCLog(@"Unable to open file for writing at path %@", [x objectForKey:@"Path"]); return nil;}
47+
48+
if (![NSString detectFileEncoding:&fileEncoding path:[x objectForKey:@"Path"] error:nil]) {
49+
// fallback
50+
fileEncoding = NSUTF8StringEncoding;
51+
}
4552

4653
[self.fileHandlers setObject:fileHandle forKey:[x objectForKey:@"Language"]];
4754
[heads addObject:[x objectForKey:@"Language"]];
@@ -63,7 +70,7 @@ - (void)writeTranslations:(NSDictionary*)translations failure:(void(^)(NSError *
6370
{
6471
NSString *comment = [NSString stringWithFormat:@"%@\n", [[translationDict objectForKey:@"Comment"] stringByReplacingOccurrencesOfString:@"\\n" withString:@"\n"]];
6572
for(NSString *fileHandleKey in self.fileHandlers)
66-
[(NSFileHandle*)[self.fileHandlers objectForKey:fileHandleKey] writeData:[comment dataUsingEncoding:NSUTF8StringEncoding]];
73+
[(NSFileHandle*)[self.fileHandlers objectForKey:fileHandleKey] writeData:[comment dataUsingEncoding:self.fileEncoding]];
6774
}
6875

6976
for(NSString *header in self.headers)
@@ -72,7 +79,7 @@ - (void)writeTranslations:(NSDictionary*)translations failure:(void(^)(NSError *
7279
if(!translation.length) translation = key;
7380

7481
NSString *line = [NSString stringWithFormat:@"\"%@\" = \"%@\";\n\n", key, translation];
75-
[(NSFileHandle*)[self.fileHandlers objectForKey:header] writeData:[line dataUsingEncoding:NSUTF8StringEncoding]];
82+
[(NSFileHandle*)[self.fileHandlers objectForKey:header] writeData:[line dataUsingEncoding:self.fileEncoding]];
7683
}
7784
}
7885

0 commit comments

Comments
 (0)