ANSI(ASCII字符集)和UNICODE(UTF8,UTF16 )

   编码指不同国家的语言在计算机中的一种存储和解释规范。

   ANSI与ASCII 
   最初,Internet上只有一种字符集——ANSI的ASCII字符集(American Standard Code for Information Interchange, “美国信息交换标准码),它使用7 bits来表示一个字符,总共表示128个字符,后来IBM公司在此基础上进行了扩展,用8bit来表示一个字符,总共可以表示256个字符,充分利用了一个字节所能表达的最大信息 
nANSI字符集:ASCII字符集,以及由此派生并兼容的字符集,如:GB2312,正式的名称为MBCS(Multi-Byte Chactacter System,多字节字符系统),通常也称为ANSI字符集。 

   UNICODE与UTF8,UTF16 
   由于每种语言都制定了自己的字符集,导致最后存在的各种字符集实在太多,在国际交流中要经常转换字符集非常不便。因此,产生了Unicode字符集,它固定使用16 bits(两个字节)来表示一个字符,共可以表示65536个字符 
n标准的Unicode称为UTF-16(UTF:UCS Transformation Format )。后来为了双字节的Unicode能够在现存的处理单字节的系统上正确传输,出现了UTF-8,使用类似MBCS的方式对Unicode进行编码。(Unicode字符集有多种编码形式) 
例如“连通”两个字的Unicode标准编码UTF-16 (big endian)为:DE 8F 1A 90 
而其UTF-8编码为:E8 BF 9E E9 80 9A 

   当一个软件打开一个文本时,它要做的第一件事是决定这个文本究竟是使用哪种字符集的哪种编码保存的。软件一般采用三种方式来决定文本的字符集和编码: 
检测文件头标识,提示用户选择,根据一定的规则猜测 
最标准的途径是检测文本最开头的几个字节,开头字节 Charset/encoding,如下表: 
EF BB BF UTF-8 
FE FF UTF-16/UCS-2, little endian 
FF FE UTF-16/UCS-2, big endian 
FF FE 00 00 UTF-32/UCS-4, little endian. 
00 00 FE FF UTF-32/UCS-4, big-endian.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目录 缩略词 正文之前 1. 目的 2. 本文内容 3. 声明 1. 字符编码相关的背景知识 1.1. 拉丁字母 1.1.1. 我们的目标 1.2. 什么是字符编码 2. 字符编码标准 2.1. 只支持基本的拉丁字符的字符编码:ASCII 2.1.1. ASCII的由来 2.1.2. ASCII编码规则 2.1.2.1. ASCII字符集中的功能/控制字符 2.1.2.1.1. 什么是Function Code功能码或 Function Character功能字符 2.1.2.1.2. ASCII中的Function/Control Code功能字符的详细含义 2.1.2.1.2.1. 0 – NUL – NULl 字符/空字符 2.1.2.1.2.2. 1 – SOH – Start Of Heading 标题开始 2.1.2.1.2.3. 2 – STX,3 – ETX 2.1.2.1.2.4. 4 – EOT – End Of Transmission 传输结束 2.1.2.1.2.5. 5 – ENQ – ENQuiry 请求 2.1.2.1.2.6. 6 – ACK – ACKnowledgment 回应/响应 2.1.2.1.2.7. 7 – BEL – [audible] BELl 2.1.2.1.2.8. 8 – BS – BackSpace 退格键 2.1.2.1.2.9. 9 – HT – Horizontal Tab 水平制表符 2.1.2.1.2.10. 10 – LF – Line Feed 换行 2.1.2.1.2.11. 11 – VT – Vertical Tab 垂直制表符 2.1.2.1.2.12. 12 – FF – Form Feed 换页 2.1.2.1.2.13. 13 – CR – Carriage return 机器的滑动部分/底座 返回 -> 回车 2.1.2.1.2.14. 14 – SO,15 – SI 2.1.2.1.2.15. 16 – DLE – Data Link Escape 数据链路转义 2.1.2.1.2.16. 17 – DC1 – Device Control 1 / XON – Transmission on 2.1.2.1.2.17. 18 – DC2 – Device Control 2 2.1.2.1.2.18. 19 – DC3 – Device Control 3 / XOFF – Transmission off 传输中断 2.1.2.1.2.19. 20 – DC4 – Device Control 4 2.1.2.1.2.20. 21 – NAK – Negative AcKnowledgment 负面响应-> 无响应, 非正常响应 2.1.2.1.2.21. 22 – SYN – SYNchronous idle 2.1.2.1.2.22. 23 – ETB – End of Transmission Block 块传输中止 2.1.2.1.2.23. 24 – CAN – CANcel 取消 2.1.2.1.2.24. 25 – EM – End of Medium 已到介质末端,介质存储已满 2.1.2.1.2.25. 26 – SUB – SUBstitute character替补/替换 2.1.2.1.2.26. 27 – ESC – ESCape 逃离/取消 2.1.2.1.2.27. 28 – FS – File Separator 文件分隔符 2.1.2.1.2.28. 29 – GS – Group Separator分组符 2.1.2.1.2.29. 30 – RS – Record Separator记录分隔符 2.1.2.1.2.30. 31 – US – Unit Separator 单元分隔符 2.1.2.1.2.31. 32 – SP – White SPace 空格键 2.1.2.1.2.32. 127 – DEL – DELete 删除 2.1.2.1.3. 各种字符的标准的读法/叫法 2.1.3. ISO 646 2.2. 支持多种衍生拉丁字母的字符编码:EASCII和ISO 8859 2.2.1. EASCII 2.2.2. ISO 8859 2.2.2.1. ISO/IEC 8859出现的背景 2.2.2.2. ISO/IEC 8859的编码规则 2.2.2.3. ISO/IEC 8859的特点 2.2.2.4. ISO/IEC 6429 2.2.2.5. ISO 8859和ISO-8859的区别和联系 2.2.2.5.1. 原先的ISO 8859-1和我们常说的ISO 8859-1 2.3.
UTF-8与ANSI是不同的字符编码方式,UTF-8支持全球范围内的字符,而ANSI只支持ASCII字符集。因此,将UTF-8编码转换为ANSI编码需要进行字符集的转换。 以下是一些实现UTF-8转ANSI的示例方法: 方法一:使用Windows API函数进行编码转换 在Windows平台上,可以使用Windows API函数WideCharToMultiByte和MultiByteToWideChar进行编码转换。此方法需要包含Windows.h头文件。 ```c #include <windows.h> #include <stdio.h> int main() { // UTF-8字符串 char utf8_str[] = "你好,世界!"; // 将UTF-8字符串转换为Unicode字符串 int wide_len = MultiByteToWideChar(CP_UTF8, 0, utf8_str, -1, NULL, 0); wchar_t* wide_str = (wchar_t*)malloc(wide_len * sizeof(wchar_t)); MultiByteToWideChar(CP_UTF8, 0, utf8_str, -1, wide_str, wide_len); // 将Unicode字符串转换为ANSI字符串 int ansi_len = WideCharToMultiByte(CP_ACP, 0, wide_str, -1, NULL, 0, NULL, NULL); char* ansi_str = (char*)malloc(ansi_len * sizeof(char)); WideCharToMultiByte(CP_ACP, 0, wide_str, -1, ansi_str, ansi_len, NULL, NULL); printf("%s\n", ansi_str); free(wide_str); free(ansi_str); return 0; } ``` 方法二:使用iconv库进行编码转换 iconv是一个开源的字符集转换库,可以在多个操作系统平台上使用。该库可以使用iconv_open、iconv、iconv_close等函数进行字符集转换。此方法需要包含iconv.h头文件,并需要在编译时链接libiconv库。 ```c #include <iconv.h> #include <stdio.h> #include <stdlib.h> int main() { // UTF-8字符串 char utf8_str[] = "你好,世界!"; // 将UTF-8字符串转换为ANSI字符串 char* ansi_str = (char*)malloc(sizeof(char) * 256); char* inbuf = utf8_str; char* outbuf = ansi_str; size_t inlen = strlen(utf8_str); size_t outlen = 256; iconv_t cd = iconv_open("CP936", "UTF-8"); iconv(cd, &inbuf, &inlen, &outbuf, &outlen); iconv_close(cd); printf("%s\n", ansi_str); free(ansi_str); return 0; } ``` 以上两种方法均可以将UTF-8编码转换为ANSI编码。其中,Windows API函数方法只适用于Windows平台,而iconv库方法可以在多个平台上使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值