You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何无法从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)

问题原因

  1. 编码不匹配:printf是ANSI编码的输出函数,而\u2606属于Unicode字符,当前项目使用的代码页(1252)不支持该字符,导致编译时无法正确转码,运行时输出乱码。
  2. 控制台编码限制: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 20:40:13