user-0 提问: ANSI编码

回复:
user: user-1
content: 源码面前，了无秘密。 参考Windows源代码片段。

user: user-2
content: 引用 21 楼 六道佩恩 的回复:[quote=引用 19 楼 早打大打打核战争 的回复:]1. ANSI也可以把其他国家/地区制定的标准定义为自己的标准，如同中国的很多GB实际是ISO或者其他国家标准的翻版，典型如KN95和N95的标准一样。  2. IBM、微软的代码页支持的字符集多于ANSI定义的字符集，如果系统默认的是个OEM代码页，那么就不是ANSI字符集，严格来说也就不算是使用ANSI编码。但是“ANSI字符集”也经常泛指非unicode字符集，尤其是在欧美之外的地区，所以并没有那么严格的划分。  3. "A版函数按理说还是能处理该代码页的字符串吧"，是可以的，A版函数实际是调用了MultiByteToWideChar，把某个代码页的字符串转换为unicode字符串，然后调用对应的W版函数，参考该函数文档中的注释：https://docs.microsoft.com/en-us/windows/win32/api/stringapiset/nf-stringapiset-multibytetowidechar： Note  The ANSI code pages can be different on different computers, or can be changed for a single computer, leading to data corruption. For the most consistent results, applications should use Unicode, such as UTF-8 or UTF-16, instead of a specific code page, unless legacy standards or data formats prevent the use of Unicode. If using Unicode is not possible, applications should tag the data stream with the appropriate encoding name when protocols allow it. HTML and XML files allow tagging, but text files do not. 微软实际上也是使用ANSI来代表非unicode  非常感谢，这是很明确的答复，总算是知道了！  请容我再问两个额外的相关的问题可以吗？  第一个问题是，ANSI代码页真的是ANSI指定的吗？毕竟没看到微软这样说，但说了“Windows代码页称呼为ANSI代码页”，知乎上也有个人说“Windows把自己的code page称作ANSI”，这些说法感觉像是微软自己指定的。  第二个问题，Windows在内核翻新为UNICODE编码后，应该就是在这个时候创建了A版和W版函数吧？那么对于在这之前的程序，是调用的无后缀版函数吧，那么对于翻新为UNICODE的新的Windows，这些程序当时是不是都乱码了？如果不是，是怎么实现不乱码的？是不是这些程序的函数跳转的地址和A版是一样，这样就实现兼容了？[/quote]  一、是微软自己指定的（早期有一部分是IBM定义的，IBM也参与了DOS和16位windows的开发），ANSI并没有定义“代码页”这种东西 二、A版和W版函数在非unicode内核的win 9x中就有了，与基于NT内核的系统相反，win9x中的W版函数转化为A版函数调用。无后缀版字符串函数只存在于16位windows中，win32中运行win16程序是使用独立的win16子系统，所以不会乱码。

user: user-1
content: #pragma comment(lib,"user32") #pragma comment(lib,"gdi32") #include <conio.h> #include <stdio.h> #include <stdlib.h> #include <windows.h> wchar_t a2w[256]={ 0x0020,0x263a,0x263b,0x2665,0x2666,0x2663,0x2660,0x2022, 0x25d8,0x25cb,0x25d9,0x2642,0x2640,0x266a,0x266b,0x263c, 0x25ba,0x25c4,0x2195,0x203c,0x00b6,0x00a7,0x25ac,0x21a8, 0x2191,0x2193,0x2192,0x2190,0x221f,0x2194,0x25b2,0x25bc, 0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027, 0x0028,0x0029,0x002a,0x002b,0x002c,0x002d,0x002e,0x002f, 0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037, 0x0038,0x0039,0x003a,0x003b,0x003c,0x003d,0x003e,0x003f, 0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047, 0x0048,0x0049,0x004a,0x004b,0x004c,0x004d,0x004e,0x004f, 0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057, 0x0058,0x0059,0x005a,0x005b,0x005c,0x005d,0x005e,0x005f, 0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067, 0x0068,0x0069,0x006a,0x006b,0x006c,0x006d,0x006e,0x006f, 0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077, 0x0078,0x0079,0x007a,0x007b,0x007c,0x007d,0x007e,0x2302, 0x00c7,0x00fc,0x00e9,0x00e2,0x00e4,0x00e0,0x00e5,0x00e7, 0x00ea,0x00eb,0x00e8,0x00ef,0x00ee,0x00ec,0x00c4,0x00c5, 0x00e9,0x00e6,0x00c6,0x00f4,0x00f6,0x00f2,0x00fb,0x00f9, 0x00ff,0x00d6,0x00dc,0x00a2,0x00a3,0x00a5,0x20a7,0x0192, 0x00e1,0x00ed,0x00f3,0x00fa,0x00f1,0x00d1,0x00aa,0x00ba, 0x00bf,0x2310,0x00ac,0x00bd,0x00bc,0x00a1,0x00ab,0x00bb, 0x2591,0x2592,0x2593,0x2502,0x2524,0x2561,0x2562,0x2556, 0x2555,0x2563,0x2551,0x2557,0x255d,0x255c,0x255b,0x2510, 0x2514,0x2534,0x252c,0x251c,0x2500,0x253c,0x255e,0x255f, 0x255a,0x2554,0x2569,0x2566,0x2560,0x2550,0x256c,0x2567, 0x2568,0x2564,0x2565,0x2559,0x2558,0x2552,0x2553,0x256b, 0x256a,0x2518,0x250c,0x2588,0x2584,0x258c,0x2590,0x2580, 0x03b1,0x00df,0x0393,0x03c0,0x03a3,0x03c3,0x00b5,0x03c4, 0x03a6,0x0398,0x03a9,0x03b4,0x221e,0x03c6,0x03b5,0x2229, 0x2261,0x00b1,0x2265,0x2264,0x2320,0x2321,0x00f7,0x2248, 0x00b0,0x2219,0x00b7,0x221a,0x207f,0x00b2,0x25a0,0x00ff, }; extern "C" HWND WINAPI GetConsoleWindow(); void HideTheCursor() {     CONSOLE_CURSOR_INFO cciCursor;     HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);      if(GetConsoleCursorInfo(hStdOut, &cciCursor)) {         cciCursor.bVisible = FALSE;         SetConsoleCursorInfo(hStdOut, &cciCursor);     } } void ShowTheCursor() {     CONSOLE_CURSOR_INFO cciCursor;     HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);      if(GetConsoleCursorInfo(hStdOut, &cciCursor)) {         cciCursor.bVisible = TRUE;         SetConsoleCursorInfo(hStdOut, &cciCursor);     } } int main() {     HWND  hwnd;     HDC   hdc;     HFONT hfont;     wchar_t ws[256];     unsigned char s[256];     int i;       system("color F0");     system("cls");     HideTheCursor();     hwnd  = GetConsoleWindow();     hdc   = GetDC(hwnd);     hfont = CreateFont(16,  0, 0, 0, 0, 0, 0, 0, 0           , 0, 0, 0, 0, "Lucida Console");     SelectObject(hdc,hfont);     TextOutW(hdc,10,10,L"你好",2);     for (i=0;i<256;i++) s[i]=i;     for (i=0;i<256;i++) ws[i]=a2w[s[i]];     TextOutW(hdc,10, 40,ws    ,32);     TextOutW(hdc,10, 80,ws+ 32,32);     TextOutW(hdc,10,120,ws+ 64,32);     TextOutW(hdc,10,160,ws+ 96,32);     TextOutW(hdc,10,200,ws+128,32);     TextOutW(hdc,10,240,ws+160,32);     TextOutW(hdc,10,280,ws+192,32);     TextOutW(hdc,10,320,ws+224,32);     DeleteObject(hfont);     ReleaseDC(hwnd,hdc);     getch();     system("color 07");     system("cls");     ShowTheCursor();     return 0; }

user: user-1
content: #include <conio.h> #include <stdlib.h> int main() {     int i;      system("chcp 437 >NUL");     for (i=0;i<256;i++) {         if (i==0x08 || i==0x09 || i==0x0A || i==0x0D)             cprintf(" ");         else             cprintf("%c",i);         if (i%32==31) cprintf("\r\n");     }     return 0; }  在Win10 cmd窗口中运行以上代码 属性，字体选“点阵字体”和“Courier New”的截图：

user: user-1
content: 全都是历史遗留问题。

user: user-0
content: 引用 19 楼 早打大打打核战争 的回复:1. ANSI也可以把其他国家/地区制定的标准定义为自己的标准，如同中国的很多GB实际是ISO或者其他国家标准的翻版，典型如KN95和N95的标准一样。  2. IBM、微软的代码页支持的字符集多于ANSI定义的字符集，如果系统默认的是个OEM代码页，那么就不是ANSI字符集，严格来说也就不算是使用ANSI编码。但是“ANSI字符集”也经常泛指非unicode字符集，尤其是在欧美之外的地区，所以并没有那么严格的划分。  3. "A版函数按理说还是能处理该代码页的字符串吧"，是可以的，A版函数实际是调用了MultiByteToWideChar，把某个代码页的字符串转换为unicode字符串，然后调用对应的W版函数，参考该函数文档中的注释：https://docs.microsoft.com/en-us/windows/win32/api/stringapiset/nf-stringapiset-multibytetowidechar： Note  The ANSI code pages can be different on different computers, or can be changed for a single computer, leading to data corruption. For the most consistent results, applications should use Unicode, such as UTF-8 or UTF-16, instead of a specific code page, unless legacy standards or data formats prevent the use of Unicode. If using Unicode is not possible, applications should tag the data stream with the appropriate encoding name when protocols allow it. HTML and XML files allow tagging, but text files do not. 微软实际上也是使用ANSI来代表非unicode  非常感谢，这是很明确的答复，总算是知道了！  请容我再问两个额外的相关的问题可以吗？  第一个问题是，ANSI代码页真的是ANSI指定的吗？毕竟没看到微软这样说，但说了“Windows代码页称呼为ANSI代码页”，知乎上也有个人说“Windows把自己的code page称作ANSI”，这些说法感觉像是微软自己指定的。  第二个问题，Windows在内核翻新为UNICODE编码后，应该就是在这个时候创建了A版和W版函数吧？那么对于在这之前的程序，是调用的无后缀版函数吧，那么对于翻新为UNICODE的新的Windows，这些程序当时是不是都乱码了？如果不是，是怎么实现不乱码的？是不是这些程序的函数跳转的地址和A版是一样，这样就实现兼容了？

user: user-1
content: 说是一物即不中。  不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！

user: user-2
content: 1. ANSI也可以把其他国家/地区制定的标准定义为自己的标准，如同中国的很多GB实际是ISO或者其他国家标准的翻版，典型如KN95和N95的标准一样。  2. IBM、微软的代码页支持的字符集多于ANSI定义的字符集，如果系统默认的是个OEM代码页，那么就不是ANSI字符集，严格来说也就不算是使用ANSI编码。但是“ANSI字符集”也经常泛指非unicode字符集，尤其是在欧美之外的地区，所以并没有那么严格的划分。  3. "A版函数按理说还是能处理该代码页的字符串吧"，是可以的，A版函数实际是调用了MultiByteToWideChar，把某个代码页的字符串转换为unicode字符串，然后调用对应的W版函数，参考该函数文档中的注释：https://docs.microsoft.com/en-us/windows/win32/api/stringapiset/nf-stringapiset-multibytetowidechar： Note  The ANSI code pages can be different on different computers, or can be changed for a single computer, leading to data corruption. For the most consistent results, applications should use Unicode, such as UTF-8 or UTF-16, instead of a specific code page, unless legacy standards or data formats prevent the use of Unicode. If using Unicode is not possible, applications should tag the data stream with the appropriate encoding name when protocols allow it. HTML and XML files allow tagging, but text files do not. 微软实际上也是使用ANSI来代表非unicode

user: user-0
content: 引用 5 楼 早打大打打核战争 的回复:ASCII编码是ANSI编码的前身，是ASA（美国标准化协会）制定的，后来ASA改名为ANSI（美国国家标准化委员会）。 严格意义上，ASCII是7位编码，后来才出现所谓扩展ASCII编码，是8位的。但是扩展ASCII并没有得到广泛使用，使用最多的是IBM的OEM字符集编码，只有前128个字符是和ASCII兼容的，后128个符号虽然也经常被称之为扩展ASCII码，但是和ANSI的扩展编码并不一致。 ANSI编码是8位编码，但是每个编码代表的字符可以不固定，在不同字符集下可以代表不同的字符，也可以连续多个编码代表一个字符（称之为DBCS或者MBCS，是对单字节字符编码做的扩展，本质上仍然是单字节字符编码），这样可以在不改变单字节字符编码的基础上支持更大的字符集。但是ANSI并没有对各字符集名称和代号做明确定义，计算机中常用的是IBM和微软定义的代码页，比如936代表GB2312字符集，1252代表拉丁1（这个就是狭义的ANSI编码），65001代表UTF-8。 IBM、OEM代码页是否算是ANSI代码页？看了微软文档后再回过头来看，才发现你提到了这个很关键的细节 微软文档说“Windows代码页”通常称为“ ANSI代码页”，而它又罗列出了IBM、OEM、ANSI代码页，那么IBM、OEM是不是不算是Windows代码页？ 微软文档又说“ A”版本处理基于Windows代码页的文本，那么如果Windows设置代码页为IBM、OEM代码页，那岂不是ANSI版函数处理ANSI编码之外的编码字符串？  您好像没有正面回答ANSI编码是否包括单字节的编码，这个很关键，因为我已经看到很多不同的说法，不知道哪个是对的，有说“双字节”的（百度百科），有说囊括ASCII的（和百度百科矛盾）

user: user-0
content: 引用 8 楼 user-4 的回复:字符集和编码不是一个概念，不能混淆。 SBCS（窄字节字符集），MBCS（多字节字符集），DBCS（宽字节字符集）都是字符集。ANSI是一种本地化编码，根据它的编码规则可以知道它包含SCBS和MBCS字符集（也就是这些字符集在ANSI编码下都有对应的编码值）。 iso-8859-1也是一种编码，原则上它只包含SBCS字符集，但是它的扩展协议也支持MBCS字符集（就是把多字节拆成单字节来保存，需要时再组合还原）。比如‘中’的GB2312编码为0xd6d0，但是在ios-8859-1编码下可拆为0xd6，0xd0两个字节保存。 到这里看出点什么了吗？同一个字符，在不同编码下有不同值。所以应该不存在的SBCS属于ANSI编码吗这样的问题，而是SBCS在ANSI编码下是什么值的问题。  lz可以好好看看以下帖子（尤其是1.2节的ANSI编码字符串的解释和1.3节字符集和编码的解释） https://blog.csdn.net/leonwei/article/details/10431921  再看看各种编码的规定 https://blog.csdn.net/u014157109/article/details/99878548  额，我那个单字节字符集是在描述那个扩展ASCII是单字节编码，也就是单字节字符集的范围，虽然不知道有没有超过1字节的编码被称为扩展ASCII的。 我问的也不是“SBCS属于ANSI编码吗”这个问题呀，我问的是“扩展ASCII属于ANSI编码吗”，SBCS是用来描述扩展ASCII的。  这几天查阅了很多资料，其他的感觉差不多了，唯独ANSI始终有点问题，因为不同的文章，解释总是有点不一样，就连微软的文档，也感觉有点歧义。 这个第一个链接拷贝的百度百科的  “‘中’的GB2312编码为0xd6d0，但是在ios-8859-1编码下可拆为0xd6，0xd0”这句话虽然来自第二个链接，但我感觉有问题吧，前后表示的都不是同一个字符，只是字节值而已，和编码没有关系吧。  第二个链接我看到这样一句话：“Windows在美国ANSI码表示ASCII码”，这就和百度百科的解释矛盾了，百度百科说的是双字节编码，而且和ASCII并列的，现在第一个问题甚至变成了“ASCII和扩展ASCII算不算ANSI编码”  我没找到ios-8859-1的超过1字节的扩展，有的话可以发下吗？其实在看到“Windows在美国ANSI码表示ASCII码”这句话后，ios-8859-1应该不那么重要了，我主要是看ANSI编码是否是指代任何国家的当地编码，包括单字节的编码，因为百度百科说要两字节的  微软文档里也有一些不解的地方（https://docs.microsoft.com/en-us/windows/win32/intl/code-pages），说的是“Windows代码页”通常称为“ ANSI代码页”，可是在代码页标识符页面里https://docs.microsoft.com/en-us/windows/win32/intl/code-page-identifiers，微软标明了ANSI代码页，这只是一部分，还有OEM代码页和IBM代码页，到底是这些所有代码页都是ANSI代码页，还是仅标了ANSI的？如果是后者的话，那么“ANSI编码指当地的编码”这句话是不是就有点问题了？ 如果ANSI编码指Windows的当前代码页（微软文档说的，“ A”版本处理基于Windows代码页的文本），而Windows又设置了OEM代码页或IBM代码页，那么该代码页是否又算是ANSI编码？  ANSI编码这个问题困扰了我好几天了，我始终没有找到我想要的答案——准确的ANSI编码的定义，因为各处找到的定义又总有不全面或矛盾的地方。 真的很感谢你们宝贵的回答，但是和我的问题始终有些小偏差，可能是我描述的问题，所以我尽量再描述详尽点，以及我的疑惑

user: user-0
content: 引用 11 楼 早打大打打核战争 的回复:我说了，“ANSI编码是8位编码”，当然包括单字节的编码，而且严格意义上，ANSI编码就是单字节编码。基于ANSI编码设计出来的双字节字符集（DBCS）、多字节字符集（MBCS）本质上仍然属于单字节编码，只是把单字节编码做了转义处理，允许连续的两个或多个单字节编码表达超出8位编码范围的字符。 ANSI没有定义代码页，它只是定义了若干种字符集，这些字符集都是基于单字节编码设计的。由于单字节编码的限制，不同字符集的字符和编码之间没有一一映射关系，同一个编码在不同字符集中可能代表不同的符号，同一符号在不同字符集中的编码也可能不同（比如GB2312中也有一套中文的A..Z、a..z，但是编码和英文字母是不一样的）。所以IBM、微软之类厂商才搞出了代码页的设计，代码页的目的是让支持多语种的系统知道当前使用的是什么字符集，从而能把字符编码显示为正确的字符。代码页的设计只是在非unicode系统中支持大字符集的一种折中方案，虽然可以支持远多于256个字符，但是不同字符集不能共存，一切换代码页，同一个字符串显示出来可能就变了。  谢谢，ANSI包括单字节的编码这一点我知道了，谢谢  （话说，这些字符集和编码不是各个地方自己设计的吗？）  但是，后面是您还是没正面回答呀  ANSI编码==ANSI代码页吗？ ANSI编码==本地编码（当前代码页）？  这两个显然不是都成立了，因为Windows中还集成了OEM、IBM代码页，如果系统默认的是个OEM代码页，怎么算？ A版函数按理说还是能处理该代码页的字符串吧？只是这种编码是不是就不能称为ANSI编码了？即便这就是当地的编码？  还是说，当地的编码只可能是ANSI的代码页，OEM、IBM代码页都是附加的？

user: user-2
content: 老赵说的是狭义ANSI字符集，ANSI Latin-1（也就是windows 1252、ISO 8859-1），广义的ANSI字符集包括ANSI定义的所有字符集，参考：https://docs.microsoft.com/en-us/host-integration-server/core/ansi-oem-code-page-support-snanls-1

user: user-1
content: ANSI 是个人计算机使用得最普遍的字符集。由于 ANSI 标准使用单一字节表示每个字符，因此最多只能有 256 个字符和标点符号代码。虽然对英语来说已经足够了，但不能完全支持其它语言。

user: user-3
content: 引用 楼主 六道佩恩 的回复:两个问题： 1. 单字节字符集的扩展ASCII，属于ANSI编码吗？ 2. ANSI编码的定义？百度百科上有说“使用多个字节来代表一个字符的各种汉字延伸编码方式”（https://baike.baidu.com/item/ANSI/10401940#viewPageContent），但在词条“标准编码格式”中（https://baike.baidu.com/item/%E6%A0%87%E5%87%86%E7%BC%96%E7%A0%81%E6%A0%BC%E5%BC%8F/20868617?fr=aladdin），ANSI编码有提到ISO-8859-2，这个标准貌似只有一个字节呀，而且这里也在ASNI一栏中提到“一个 UNICODE 字符可能转化成一个字节或多个字节”，所以，ANSI编码是否包含有1字节的编码？与单字节字符集有什么区别？ 又见字符编码  ANSI编码不是ASCII编码  关于ANSI编码需要知道以下几点： 这玩意只在Windows中存在。 ANSI编码并不是指某一种特定的编码，而是跟地区相关的。比如：中国默认就是GBK；美国默认就是ASCII。  其实ANSI并不是某一种特定的字符编码，而是在不同的系统中，ANSI表示不同的编码。你的美国同事Bob的系统中ANSI编码其实是ASCII编码（ASCII编码不能表示汉字，所以汉字为乱码），而你的系统中（“汉字”正常显示）ANSI编码其实是GBK编码，而韩文系统中（“한국어”正常显示）ANSI编码其实是EUC-KR编码。  https://www.cnblogs.com/malecrab/p/5300486.html

user: user-2
content: 我说了，“ANSI编码是8位编码”，当然包括单字节的编码，而且严格意义上，ANSI编码就是单字节编码。基于ANSI编码设计出来的双字节字符集（DBCS）、多字节字符集（MBCS）本质上仍然属于单字节编码，只是把单字节编码做了转义处理，允许连续的两个或多个单字节编码表达超出8位编码范围的字符。 ANSI没有定义代码页，它只是定义了若干种字符集，这些字符集都是基于单字节编码设计的。由于单字节编码的限制，不同字符集的字符和编码之间没有一一映射关系，同一个编码在不同字符集中可能代表不同的符号，同一符号在不同字符集中的编码也可能不同（比如GB2312中也有一套中文的A..Z、a..z，但是编码和英文字母是不一样的）。所以IBM、微软之类厂商才搞出了代码页的设计，代码页的目的是让支持多语种的系统知道当前使用的是什么字符集，从而能把字符编码显示为正确的字符。代码页的设计只是在非unicode系统中支持大字符集的一种折中方案，虽然可以支持远多于256个字符，但是不同字符集不能共存，一切换代码页，同一个字符串显示出来可能就变了。

user: user-4
content: 补充说明一下 单字节字符集的扩展ASCII在不同的编码下的编码“值”相同（也就是编码字符集相同），但是在不同的编码下保存的字节长度不同，比如在ANSI编码下是占一个字节，但是在Unicode编码下占两个字节（高字节为0或低字节为0）。所以不能笼统的说它必然属于哪种编码。

user: user-4
content: 首先，要知道编码和文字字符集是两个概念（这里的文字字符集指的是单纯的文字字符的集合，不是指在某种编码下的字符的编码“值”的集合（前者姑且叫文字字符集，后者姑且叫编码字符集），否则容易混淆不清），它们即有联系又有区别。（我觉得lz主要就是没弄清这些概念和区别，对于相同的文字字符集，不同编码对字符定义的编码“值”不一样，也就是编码字符集不一样） 问题1 ANSI是一种编码（不是文字字符集），这种编码规定，如果是英文拉丁文等单字节字符集的字符，就用1个字节来保存，如果是汉字等双字符集的字符就用2个字节保存。每个双节字符国家的文字不一样，所以每个国家对文字字符定义的ANSI值不一样，这就造成可能对同一个文字字符可能ANSI值不一样。比如“中”，中国（台湾），日本都有这个字，但是GB2112，BIG5，JIS编码（这类称编码字符集）下该“中”字符的ANSI编码“值”不同（换个角度来说，GB2112编码字符集（这里的字符集指编码“值”的集合而不是上面说的文字字符集合）里没有定义BIG5或JIS的“中”，所以BIG5或JIS的“中”在GB2112编码下是乱码）。这里要先捋清楚编码，文字字符集和编码字符集的关系。 所以问题1的回答是，单字节字符集的扩展ASCII是个文字字符集，不能单纯地说它是什么编码，所以它未必属于ANSI编码，也能是Unicode编码  问题2 ANSI编码是否包含1字节的编码？ 包含，因为ANSI编码支持单字节字符和双字节字符。 与单字节字符集有什么区别 区别就是单字节字符集只是个文字字符集，它可以有不同的编码，比如是Unicode或UTF8编码，那么这个单字节字符集就不属于ANSI编码。

user: user-4
content: 字符集和编码不是一个概念，不能混淆。 SBCS（窄字节字符集），MBCS（多字节字符集），DBCS（宽字节字符集）都是字符集。ANSI是一种本地化编码，根据它的编码规则可以知道它包含SCBS和MBCS字符集（也就是这些字符集在ANSI编码下都有对应的编码值）。 iso-8859-1也是一种编码，原则上它只包含SBCS字符集，但是它的扩展协议也支持MBCS字符集（就是把多字节拆成单字节来保存，需要时再组合还原）。比如‘中’的GB2312编码为0xd6d0，但是在ios-8859-1编码下可拆为0xd6，0xd0两个字节保存。 到这里看出点什么了吗？同一个字符，在不同编码下有不同值。所以应该不存在的SBCS属于ANSI编码吗这样的问题，而是SBCS在ANSI编码下是什么值的问题。  lz可以好好看看以下帖子（尤其是1.2节的ANSI编码字符串的解释和1.3节字符集和编码的解释） https://blog.csdn.net/leonwei/article/details/10431921  再看看各种编码的规定 https://blog.csdn.net/u014157109/article/details/99878548

user: user-0
content: 引用 5 楼 早打大打打核战争 的回复:ASCII编码是ANSI编码的前身，是ASA（美国标准化协会）制定的，后来ASA改名为ANSI（美国国家标准化委员会）。 严格意义上，ASCII是7位编码，后来才出现所谓扩展ASCII编码，是8位的。但是扩展ASCII并没有得到广泛使用，使用最多的是IBM的OEM字符集编码，只有前128个字符是和ASCII兼容的，后128个符号虽然也经常被称之为扩展ASCII码，但是和ANSI的扩展编码并不一致。 ANSI编码是8位编码，但是每个编码代表的字符可以不固定，在不同字符集下可以代表不同的字符，也可以连续多个编码代表一个字符（称之为DBCS或者MBCS，是对单字节字符编码做的扩展，本质上仍然是单字节字符编码），这样可以在不改变单字节字符编码的基础上支持更大的字符集。但是ANSI并没有对各字符集名称和代号做明确定义，计算机中常用的是IBM和微软定义的代码页，比如936代表GB2312字符集，1252代表拉丁1（这个就是狭义的ANSI编码），65001代表UTF-8。 SBCS是否可以是ANSI编码？百度百科说是两字节，那么MBCS是否可以是ANSI编码？ 对于百度百科上，将ISO-8859-2划分到ANSI编码，该如何理解？

user: user-0
content: 引用 4 楼 user-4 的回复:补充说明一下 单字节字符集的扩展ASCII在不同的编码下的编码“值”相同（也就是编码字符集相同），但是在不同的编码下保存的字节长度不同，比如在ANSI编码下是占一个字节，但是在Unicode编码下占两个字节（高字节为0或低字节为0）。所以不能笼统的说它必然属于哪种编码。 可能是我的表达有误，我的意思是，扩展ASCII编码，就是欧洲使用的那种，字符也不多，在0xFF以内（单字节字符集），这种的编码算ANSI编码吗？我之所以提出这个问题，是因为在词条“标准编码格式”中，它在单字节编码一栏提到了ISO-8859-1标准，这个标准编码范围在0xFF以内，根据它对ANSI编码的描述“这些使用 2 个字节来代表一个字符的各种汉字延伸编码方式，称为ANSI 编码”，以及它和ANSI各划分为一栏，也就是它不属于ANSI编码，可是在ANSI编码一栏，还提到了ISO-8859-2，这个标准貌似也是单字节编码，为什么又属于ANSI编码了？  另外一个问题是，它这里说ANSI编码是两字节的，那么使用4字节的GB10830是否又能划分到ANSI编码？