首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

iOS 獲取所有可用字符串編碼並嘗試解碼文件:availableStringEncodings 完整指南

     編輯:程式設計綜合問答

需求:類似 Java Charset.availableCharsets(),在 Objective-C 中枚舉所有可用編碼,並嘗試以首個編碼讀取文件。

核心 API:NSString.availableStringEncodings

返回以 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;
}

常見編碼常量(部分)

常量說明
NSUTF8StringEncodingUTF-8(最常用)
NSUTF16StringEncodingUTF-16
NSASCIIStringEncodingASCII
NSISOLatin1StringEncodingISO Latin 1
NSJapaneseEUCStringEncoding日文 EUC
NSUTF32StringEncodingUTF-32

實戰建議

  • **優先指定 UTF-8**;僅在未知編碼文件時嘗試枚舉。
  • 大文件請用 NSFileHandle 分塊讀取或 NSStringEncodingDetectionOptionsKey(iOS 10+)自動檢測。
  • 編碼枚舉順序不保證,UTF-8 不一定是第一個。

掌握 availableStringEncodings,優雅處理跨平台文件編碼兼容。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved