为何无法从C编写的DLL中在Python打印Unicode字符☆?
C语言DLL输出Unicode字符显示为?的问题解决
问题详情
我在Visual Studio中创建了一个纯C语言的DLL项目,代码如下:
lib.c
void print_star() { printf("\u2606"); // 预期打印:☆ }
lib.h
#pragma once #ifdef LIB_EXPORTS #define LIB __declspec(dllexport) #else #define LIB __declspec(dllimport) #endif LIB void print_star();
编译生成DLL后,用Python的ctypes导入调用:
import ctypes lib = ctypes.CDLL(r"C:\path\to\lib.dll") lib.print_star()
但执行后并未输出预期的☆,而是显示?;如果直接在源码中写入☆字符,编译时会弹出警告:
warning C4566: character represented by universal-character-name '\u2606' cannot be represented in the current code page (1252)
问题原因
- 编码不匹配:
printf是ANSI编码的输出函数,而\u2606属于Unicode字符,当前项目使用的代码页(1252)不支持该字符,导致编译时无法正确转码,运行时输出乱码。 - 控制台编码限制:Windows默认控制台代码页不支持Unicode字符的正常显示。
解决办法
1. 改用宽字符输出函数
将C代码中的printf替换为宽字符版本的wprintf,并使用宽字符字符串(前缀L):
修改后的lib.c:
#include <wchar.h> void print_star() { wprintf(L"\u2606\n"); }
2. 配置源码编码与项目字符集
- 设置源码编码:右键
lib.c文件 → 属性 → 高级 → 编码,选择UTF-8 带签名 (UTF-8 with BOM),保存文件。 - 设置项目字符集:打开项目属性 → 配置属性 → 常规 → 字符集,选择
使用 Unicode 字符集。
3. 确保Python控制台支持Unicode
运行Python代码前,先将控制台代码页切换为UTF-8,修改Python脚本:
import ctypes import os import sys # 设置控制台编码为UTF-8 os.system('chcp 65001') sys.stdout.reconfigure(encoding='utf-8') lib = ctypes.CDLL(r"C:\path\to\lib.dll") lib.print_star()
也可以手动在控制台执行chcp 65001后再运行Python脚本。
内容的提问来源于stack exchange,提问作者Priff13
相关产品推荐
相关产品推荐

