Last active
September 15, 2015 07:52
-
-
Save acalism/50c9f8ccce995e27517c to your computer and use it in GitHub Desktop.
打开文本文件前,你需要知道其编码。如果用QuickLook打开(UIDocumentInteractionController封装了QLPreviewController),需要先将其编码转为UTF16(即NSUnicodeStringEncoding)。下面的方法将url对应的本地文件转化为可以查看的编码(UTF16)))
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
- (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