iOS_技巧(4)_转码(UTF-8 /GBK/Unicode/GBK2312)

本文详细介绍了几种常见的字符编码,包括UTF-8、GBK及其相互之间的转换方法。通过具体的示例代码,展示了如何在不同编码间进行转换,适用于解决网页、文件传输等场景下的编码兼容问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一丶 UTF-8 /GBK

UTF-8(8-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码,又称万国码。由Ken Thompson于1992年创建。现在已经标准化为RFC 3629。UTF-8用1到6个字节编码UNICODE字符。用在网页上可以同一页面显示中文简体繁体及其它语言(如英文,日文,韩文)。

GBK全称《汉字内码扩展规范》(GBK即“国标”、“扩展”汉语拼音的第一个字母,英文名称:Chinese Internal Code Specification

/**
 * GBK->UTF8
 */
//方法一 旧方法
NSString *encode1 = [@"%E6%88%91" stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSLog(@"--encode1->%@<------", encode1);

//方法二   新方法
NSLog(@"--encode2->%@<------", [@"%E6%88%91" stringByRemovingPercentEncoding]);

/**
 *  UTF-8 ->GBK
 */
//方法一 旧方法
NSString *decode1 = [@"我" stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSLog(@"--decode1-->%@<-----", decode1);

//方法二 新方法
NSLog(@"--decode1-->%@<-----",  [@"我" stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]]);

二丶Unicode/UTF-8

Unicode(统一码、万国码、单一码)是计算机科学领域里的一项业界标准,包括字符集、编码方案等。Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。

出现类似这样格式的字段"\U6df1\U5733\U56fd\U5f00\U884c01\U673a\U623",通常为Unicode码,转换测试函数为

/**
 *  Unicode码UTF-8
 *
 *  @param unicodeStr Unicode
 *
 *  @return UTF-8
 */
- (NSString *)replaceUnicode:(NSString *)unicodeStr
{
    NSString *tempStr1 = [unicodeStr stringByReplacingOccurrencesOfString:@"\\u" withString:@"\\U"];
    NSString *tempStr2 = [tempStr1 stringByReplacingOccurrencesOfString:@"\"" withString:@"\\\""];
    NSString *tempStr3 = [[@"\"" stringByAppendingString:tempStr2] stringByAppendingString:@"\""];
    NSData *tempData = [tempStr3 dataUsingEncoding:NSUTF8StringEncoding];
    //旧方法
//    NSString *returnStr = [NSPropertyListSerialization propertyListFromData:tempData mutabilityOption:NSPropertyListImmutable format:NULL errorDescription:NULL];
    //新方法
NSString *returnStr = [NSPropertyListSerialization propertyListWithData:tempData options:NSPropertyListImmutable  format:NULL  error:NULL];


    return [returnStr stringByReplacingOccurrencesOfString:@"\\r\\n" withString:@"\n"];
}

三丶 GBK/UTF-8

出现类似这样格式的字段"深圳银行",通常为GBK码,转换方式为

    NSURL *url = [NSURL URLWithString:@"深圳银&#x884C"];

    NSData *responseData = [NSData dataWithContentsOfURL:url];

    NSStringEncoding enc = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);

    NSString *responseString = [[NSString alloc] initWithData:responseData encoding:enc];

四丶 UTF-8/GBK2312

在ftp转码解码中遇到的问题;

//解码:从服务器请求数据,转成显示中文
- (NSString *)ChangeToChinessEncode:(NSString *)fileTitleStr
{    if (fileTitleStr != NULL)    {        char *ReadStoreValue = (char *)[fileTitleStr cStringUsingEncoding:[NSString defaultCStringEncoding]];        if ( ReadStoreValue != NULL )        {
            fileTitleStr = [NSString stringWithCString:ReadStoreValue encoding: -2147482062];
        }    }    return fileTitleStr;
}


//编码:
- (NSString *)encodeString:(NSString *)string;
{
    NSString *urlEncoded = (__bridge_transfer NSString *) CFURLCreateStringByAddingPercentEscapes(
        NULL,
        (__bridge CFStringRef) string,
        NULL,
        (CFStringRef) @"!*'\"();:@&=+$,?%#[]% ",
        kCFStringEncodingGB_18030_2000);
    return urlEncoded;
}


文/丶纳凉(简书作者)
原文链接:http://www.jianshu.com/p/352acbbbb244
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
<think>好的,我现在要回答用户关于Python中UTF-8GBK编码的区别及使用场景的问题。首先,我需要确保自己理解这两个编码的基本概念,以及它们在Python中的应用。 首先,UTF-8GBK都是字符编码,但它们的用途和背景不同。GBK主要用于简体中文环境,而UTF-8是一种国际化的编码,支持多种语言。用户可能想知道它们的具体区别,以及在什么情况下应该使用哪一种。 接下来,我需要回忆Python中处理文件编码的方法。例如,在打开文件时使用`open`函数指定编码参数,或者使用`encode`和`decode`方法进行转换。还要注意Python3中字符串默认是Unicode,而字节串则需要显式编码。 然后,我应该考虑用户的实际应用场景。比如,处理中文文本文件时,如果文件来源是国内系统,可能用GBK;如果是国际化的应用,或者需要处理多种语言,UTF-8更合适。同时,转换编码时可能会出现乱码问题,特别是当源编码和目标编码不兼容时,比如用GBK打开UTF-8文件,或者反过来。 还需要提到常见的转换方法,比如使用Python的`codecs`模块,或者直接读写时指定编码。可能还需要给出代码示例,帮助用户理解如何操作。例如,如何将GBK文件转换为UTF-8,或者处理编码错误时的策略,比如`errors`参数的使用。 此外,用户可能关心在不同操作系统下的兼容性问题。UTF-8被广泛支持,而GBK在旧版Windows系统中更常见。因此,跨平台项目可能倾向于使用UTF-8以避免兼容性问题。 最后,要确保回答结构清晰,分点说明区别、使用场景和转换方法,并引用提供的参考资料,比如引用[3]提到UTF-8的广泛支持,引用[4]关于转换方法。同时,生成相关问题,帮助用户进一步探索。</think>### Python文件编码UTF-8GBK的区别与使用场景 #### 一、核心区别 1. **字符覆盖范围** - **GBK**: 主要支持简体中文、繁体中文及部分日韩汉字,包含约21,886个字符[^4]。 - **UTF-8**: 覆盖Unicode标准所有字符(包括全球语言、符号、表情等),支持动态扩展,如当前版本包含超过14万个字符[^3]。 2. **存储效率** - **GBK**: 中文字符固定占用2字节,如`"中"`编码为`0xD6D0`。 - **UTF-8**: 中文字符占用3字节(如`"中"`编码为`0xE4B8AD`),但拉丁字母保持1字节,数学公式如字符长度$L_{\text{UTF-8}}=3n_{\text{中文}}+1n_{\text{英文}}$。 3. **兼容性** - **GBK**: 主要在中文Windows系统默认使用(如Windows XP到Windows 10的简体中文版)。 - **UTF-8**: 被现代操作系统(Linux/macOS/Android/iOS)和编程语言原生支持,如Python3字符串默认使用UTF-8编码的Unicode存储[^3]。 #### 二、使用场景对比 | 场景 | GBK适用性 | UTF-8适用性 | |---------------------|-------------------|--------------------------| | 纯中文文本处理 | ✅ 本地旧系统兼容 | ❌ 存储效率较低 | | 多语言混合文本 | ❌ 无法支持 | ✅ 必需 | | Web开发/API交互 | ❌ 易乱码 | ✅ 国际标准 | | 跨平台项目 | ❌ 兼容性差 | ✅ 统一编码 | #### 三、Python中的编码转换方法 1. **文件读写指定编码** ```python # GBK文件转UTF-8 with open('gbk_file.txt', 'r', encoding='gbk') as f: content = f.read() with open('utf8_file.txt', 'w', encoding='utf-8') as f: f.write(content) ``` 2. **字节流转换** ```python gbk_bytes = "中文".encode('gbk') # b'\xD6\xD0\xCE\xC4' utf8_bytes = gbk_bytes.decode('gbk').encode('utf-8') # b'\xE4\xB8\xAD\xE6\x96\x87' ``` 3. **错误处理策略** ```python # 忽略无法解码的字符 with open('file.txt', 'r', encoding='gbk', errors='ignore') as f: content = f.read() ``` #### 四、典型问题解决方案 1. **乱码修复** 若用UTF-8打开GBK文件会出现`浣犲ソ`类乱码,可通过重新解码修复: ```python wrong_text = "浣犲ソ".encode('utf-8').decode('gbk') # 输出"你好" ``` 2. **BOM标记处理** Windows下UTF-8文件可能包含BOM头(`\xef\xbb\xbf`),需指定参数: ```python with open('file.txt', 'r', encoding='utf-8-sig') as f: # 自动去除BOM content = f.read() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值