C语言使用puts()函数输出「”」字符异常显示为ö的求助
问题分析与解决
你的问题核心是编码/代码页不匹配,加上对C语言转义字符的误解,导致全角引号输出乱码,以下是具体原因和不用printf的解决办法:
为什么会输出ö?
你用的”是中文全角右引号,属于多字节字符(UTF-8下占3字节,GBK下占2字节),但puts是单字节字符串处理函数。当终端代码页和你的源文件编码不匹配时,多字节字符会被拆成单个字节解析:
比如源文件是UTF-8,”的编码是0xE2 0x80 0x9D,如果终端用GBK(代码页936),0xE2 0x80在GBK里对应的就是ö,剩下的字节被忽略,所以就出现了乱码。另外\”写法完全无效——C语言的转义字符只针对ASCII范围内的字符,全角引号不属于转义范畴,编译器只会把\当成普通字符处理。
不用printf的解决办法
方法1:对齐代码页与源文件编码
假设你的源文件是UTF-8编码:
- 运行程序前,在终端执行命令:
chcp 65001(把终端代码页改成UTF-8) - 编译时指定源文件编码(比如GCC加参数:
gcc -finput-charset=utf-8 yourfile.c) - 直接用
puts("”");就能正确输出,不需要任何转义。
方法2:使用宽字符输出函数wputs
如果想更规范处理多字节/宽字符,改用宽字符串和wputs:
#include <wchar.h> #include <locale.h> int main() { setlocale(LC_ALL, ""); // 自动匹配系统区域设置的编码 wputs(L"”"); // L前缀表示宽字符串 return 0; }
这个方法不需要手动改代码页,只要系统区域设置正确就能输出正确的全角引号,完全不用printf。
方法3:改用半角引号(如果能接受)
如果可以用半角引号",直接写puts("\"");——这是C语言标准的转义写法,不管编码如何都不会乱码,但输出的是半角引号,看你的需求选择。
内容的提问来源于stack exchange,提问作者DScounterGO
相关产品推荐
相关产品推荐

