Skip to content

Instantly share code, notes, and snippets.

@acalism
Last active September 15, 2015 07:52
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save acalism/50c9f8ccce995e27517c to your computer and use it in GitHub Desktop.
Save acalism/50c9f8ccce995e27517c to your computer and use it in GitHub Desktop.
打开文本文件前,你需要知道其编码。如果用QuickLook打开(UIDocumentInteractionController封装了QLPreviewController),需要先将其编码转为UTF16(即NSUnicodeStringEncoding)。下面的方法将url对应的本地文件转化为可以查看的编码(UTF16)))
- (void)reEncodingTextFileAtUrl:(NSURL*)url{
NSString * str = nil;
NSStringEncoding fileEncoding = 0;
NSError * __autoreleasing error;
if (![url checkResourceIsReachableAndReturnError:&error]) { // 非必须
NSLog(@"not reachable: %@", error.localizedDescription);
return;
}
// 自动获取编码,但探测的编码范围公限于CFString.h头文件里提到的编码
str = [NSString stringWithContentsOfURL:url usedEncoding:&fileEncoding error:&error];
if (error == nil) {
NSLog(@"txt file encoding: %@(%zd)", [NSString localizedNameOfStringEncoding:fileEncoding], fileEncoding);
}
if (fileEncoding == NSUnicodeStringEncoding) {
return; // 编码正确,无需转换
}
#if 0
// 另一种探测编码的方法。理应与上述api等价,但由于与下述suggestedEncodings数组的排列顺序相关,事实上不等价。——故不推荐
NSArray *suggestedEncodings = @[
//@(NSUnicodeStringEncoding),
@(NSUTF16StringEncoding),
@(NSUTF8StringEncoding),
@(NSUTF16BigEndianStringEncoding),
@(NSUTF16LittleEndianStringEncoding),
@(NSUTF32StringEncoding),
@(NSUTF32BigEndianStringEncoding),
@(NSUTF32LittleEndianStringEncoding),
@(NSNEXTSTEPStringEncoding),
@(NSJapaneseEUCStringEncoding),
@(NSISOLatin1StringEncoding),
@(NSSymbolStringEncoding),
@(NSShiftJISStringEncoding),
@(NSISOLatin2StringEncoding),
@(NSWindowsCP1251StringEncoding),
@(NSWindowsCP1252StringEncoding),
@(NSWindowsCP1253StringEncoding),
@(NSWindowsCP1254StringEncoding),
@(NSWindowsCP1250StringEncoding),
@(NSISO2022JPStringEncoding),
@(NSMacOSRomanStringEncoding),
@(NSNonLossyASCIIStringEncoding),
@(NSASCIIStringEncoding),
];
for (NSNumber *encodingNum in suggestedEncodings) {
error = nil;
str = [NSString stringWithContentsOfURL:url encoding:encodingNum.integerValue error:&error];
if (error == nil && str != nil) {
fileEncoding = encodingNum.integerValue;
if (fileEncoding == NSUnicodeStringEncoding) {
return;
}
break;
}
}
#endif
if (error) {
//都没有则猜测中文编码(暂未考虑下述编码的顺序问题)
NSArray * chineseEncodings = @[
@(kCFStringEncodingGB_18030_2000),
@(kCFStringEncodingGB_2312_80),
@(kCFStringEncodingGBK_95),
@(kCFStringEncodingBig5),
@(kCFStringEncodingBig5_E),
@(kCFStringEncodingBig5_HKSCS_1999),
@(kCFStringEncodingHZ_GB_2312),
@(kCFStringEncodingISO_2022_CN),
@(kCFStringEncodingISO_2022_CN_EXT),
];
NSData *data = [NSData dataWithContentsOfURL:url];
str = nil;
for (NSNumber *encValue in chineseEncodings) {
NSStringEncoding enc = CFStringConvertEncodingToNSStringEncoding(encValue.unsignedIntValue);
str = [[NSString alloc] initWithData:data encoding:enc];
if (str) {
NSLog(@"txt file encoding: %@(%zd)", [NSString localizedNameOfStringEncoding:enc], enc);
break;
}
}
}
// 重新以正确编码写入文件
NSData *data = [str dataUsingEncoding:NSUTF16StringEncoding];
[data writeToURL:url atomically:YES];
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment