C语言中如何打印unsigned char数组中值为178的字符?
问题:C语言中无法通过ASCII值178打印▒字符
我想在C语言中打印字符▒,原本打算把它和ASCII值小于127的标准字符一起存在char数组里。知道这个字符的ASCII十进制值是178后,我把数组改成了unsigned char类型来支持0-255的取值。现在用\u2592能正常打印这个字符,但遍历数组打印时,ASCII小于127的字符都显示正常,唯独值为178的字符显示不出来,求解决办法。
代码示例
#include <stdio.h> #include <stdlib.h> int main(void) { printf("Raw unicode call: \\u2592\n"); unsigned char array[2][3] = { { 35, 0x26, 0x27 }, { 0x28, 0x29, 0x2A } }; array[1][2] = 178; for (int i=0; i<2; i++) { for (int j=0; j<3; j++) { printf("Array[%d][%d]: %c\n", i, j, array[i][j]); } } }
运行输出
Raw unicode call: ▒ Array[0][0]: # Array[0][1]: & Array[0][2]: ' Array[1][0]: ( Array[1][1]: ) Array[1][2]:
解决办法
核心原因
你说的178是DOS/Windows OEM字符集(比如CP437)里▒的单字节编码,但现在绝大多数终端默认用的是UTF-8编码。UTF-8中▒的编码是三个字节的0xE2 0x96 0x92,不是单字节的178。直接把178存到数组里,终端按UTF-8解析时会识别为无效编码,所以显示空白。
具体方案
方案1:切换终端到OEM编码(兼容性差)
如果是Windows命令行,执行chcp 437切换到CP437编码,再运行程序就能正常显示178对应的▒。但这种方法只适用于传统CMD终端,VS Code、Windows Terminal等现代终端可能不支持,跨平台也无效。
方案2:用宽字符处理(推荐)
使用wchar_t宽字符数组存储Unicode字符,配合wprintf打印,同时设置本地化确保输出正常:
#include <stdio.h> #include <wchar.h> #include <locale.h> int main(void) { setlocale(LC_ALL, ""); // 初始化本地化,让宽字符输出适配终端编码 wprintf(L"Raw unicode call: %lc\n", L'\u2592'); wchar_t array[2][3] = { { L'#', L'&', L'\'' }, { L'(', L')', L'\u2592' } }; for (int i=0; i<2; i++) { for (int j=0; j<3; j++) { wprintf(L"Array[%d][%d]: %lc\n", i, j, array[i][j]); } } return 0; }
方案3:直接存储UTF-8字节序列
如果坚持用unsigned char数组,可以把▒的UTF-8三字节序列存进去,打印时按字符串输出:
#include <stdio.h> #include <stdlib.h> int main(void) { printf("Raw unicode call: \\u2592\n"); // 调整数组结构,预留UTF-8多字节空间 unsigned char array[2][5] = { { 35, 0x26, 0x27, 0, 0 }, { 0x28, 0x29, 0xE2, 0x96, 0x92 } }; // 打印UTF-8编码的▒ printf("Array[1][2] (UTF-8): %s\n", (char*)&array[1][2]); return 0; }
内容的提问来源于stack exchange,提问作者user23109837
相关产品推荐
相关产品推荐

