【问题标题】:Automatic NSEncoding detection自动 NSEncoding 检测
【发布时间】:2014-10-06 10:06:58
【问题描述】:

在我的程序中,我收到一个 NSData,它的字符串有时以 UTF8 编码,有时以 Latin1 编码。有没有办法自动检测正在使用的编码? 我尝试将其写入文件,以便可以使用 stringWithContentsOfFile:usedEncoding:error:,但它始终以 UTF8 响应。

[receivedData writeToFile:path atomically:YES];
NSError *error = nil;
Debug(@"Write returned error: %@", [error localizedDescription]);
NSStringEncoding enc;
NSString *content=[NSString stringWithContentsOfFile:path usedEncoding:&enc error:&error];

也许我没有正确理解我应该如何解决这个问题,但从我读到的stringWithContentsOfFile:usedEncoding:error: 应该是要走的路。关于我做错了什么或如何解决这个问题的任何建议?

【问题讨论】:

    标签: objective-c nsstring nsdata


    【解决方案1】:

    您可以从响应中获取编码。 (例如 NSURLResponse、NSHTTPURLResponse...)

        NSStringEncoding stringEncoding = NSUTF8StringEncoding;
        if (response.textEncodingName) {
            CFStringEncoding encoding = CFStringConvertIANACharSetNameToEncoding((CFStringRef)response.textEncodingName);
            if (encoding != kCFStringEncodingInvalidId) {
                stringEncoding = CFStringConvertEncodingToNSStringEncoding(encoding);
            }
        }
    

    【讨论】:

      【解决方案2】:

      很有可能您的文本实际上只包含 ASCII 字符,因此无法区分使用的编码是 UTF-8 还是某些拉丁编码。在这种情况下,您很可能会被告知“它是 UTF-8”。

      要正确测试这一点,您必须说服服务器使用拉丁编码发送类似 ÄÖÜ 的内容。

      (如果不是 UTF-8,也很难猜测使用了哪种编码,因为通常许多 8 位编码可能是有效的)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-07-25
        • 1970-01-01
        • 2021-08-01
        • 2016-10-30
        • 2012-08-27
        • 2013-10-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多