使用ctypes.windll.kernel32.SetConsoleTitleW设置标题为何显示为中文?
为什么调用
SetConsoleTitleW后控制台标题显示成中文了? 嘿,这个问题我之前也踩过坑!其实核心原因是Windows API的宽字符版本和ctypes的默认参数处理不兼容,导致编码转错了,才出现了莫名其妙的中文乱码。
具体来说:
SetConsoleTitleW是Windows专门用来处理Unicode字符串的宽字符版本API,它要求传入的是UTF-16编码的宽字符(每个字符占2字节)。- 但你直接传Python字符串的时候,ctypes默认会把字符串转换成系统默认的ANSI编码字节串(比如中文Windows里是GBK),然后把这个字节串当作宽字符来解析。
- 你的"Test"是四个ASCII字符,每个只占1字节,总共4字节。被当作UTF-16宽字符时,会被拆成两个2字节的单元,这两个单元对应的GBK编码正好是中文汉字(比如常见的“烫”“屯”这类乱码),所以控制台就显示出中文了。
给你两个简单的解决办法:
方法一:让ctypes正确识别宽字符参数
给SetConsoleTitleW明确指定参数类型为宽字符指针,这样ctypes就会把Python字符串正确转换成UTF-16宽字符传递给API:
import ctypes kernel32 = ctypes.windll.kernel32 # 声明函数的参数类型是宽字符指针 kernel32.SetConsoleTitleW.argtypes = [ctypes.c_wchar_p] Title = "Test" kernel32.SetConsoleTitleW(Title)
方法二:改用ANSI版本的API
如果你的标题只用到ASCII字符,直接调用ANSI版本的SetConsoleTitleA就行,它会自动适配系统默认编码:
import ctypes Title = "Test" ctypes.windll.kernel32.SetConsoleTitleA(Title)
内容的提问来源于stack exchange,提问作者Goten Black
相关产品推荐
相关产品推荐

