需求:類似 Java Charset.availableCharsets(),在 Objective-C 中枚舉所有可用編碼,並嘗試以首個編碼讀取文件。
返回以 0 結尾的 NSStringEncoding 數組指針。
- (NSString *)readFileWithFirstAvailableEncoding:(NSString *)filePath {
// 1. 獲取所有編碼
NSMutableArray *encodings = [NSMutableArray array];
const NSStringEncoding *encPtr = [NSString availableStringEncodings];
while (*encPtr != 0) {
[encodings addObject:@(*encPtr)];
encPtr++;
}
if (encodings.count == 0) return nil;
// 2. 讀取文件數據
NSError *error = nil;
NSData *data = [NSData dataWithContentsOfFile:filePath
options:NSDataReadingUncached
error:&error];
if (!data) {
NSLog(@"Read file failed: %@", error);
return nil;
}
// 3. 嘗試首個編碼解碼
NSStringEncoding firstEnc = [encodings[0] unsignedIntegerValue];
NSString *string = [[NSString alloc] initWithData:data encoding:firstEnc];
// 4. 若失敗,可遍歷嘗試其他編碼
if (!string) {
for (NSNumber *encNum in encodings) {
string = [[NSString alloc] initWithData:data encoding:[encNum unsignedIntegerValue]];
if (string) break;
}
}
return string;
}
| 常量 | 說明 |
|---|---|
| NSUTF8StringEncoding | UTF-8(最常用) |
| NSUTF16StringEncoding | UTF-16 |
| NSASCIIStringEncoding | ASCII |
| NSISOLatin1StringEncoding | ISO Latin 1 |
| NSJapaneseEUCStringEncoding | 日文 EUC |
| NSUTF32StringEncoding | UTF-32 |
NSFileHandle 分塊讀取或 NSStringEncodingDetectionOptionsKey(iOS 10+)自動檢測。掌握 availableStringEncodings,優雅處理跨平台文件編碼兼容。