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

使用python-escpos打印阿拉伯字符失败,转位图遇编码错误求助

解决SPRT热敏打印机打印阿拉伯字符的问题

一、修复PIL转位图的Unicode编码错误

你遇到的UnicodeEncodeError是因为PIL默认字体不支持阿拉伯字符,同时阿拉伯文是从右到左(RTL)的文字,需处理排版顺序,按以下步骤操作:

  • 安装依赖库
    需要两个库处理阿拉伯文的正确排版:
pip install arabic-reshaper python-bidi pillow
  • 修改后的文本转位图代码
from PIL import Image, ImageDraw, ImageFont
import arabic_reshaper
from bidi.algorithm import get_display

# 处理阿拉伯文本:重塑字符+调整RTL顺序
arabic_text = 'محمد'
reshaped_text = arabic_reshaper.reshape(arabic_text)
bidi_text = get_display(reshaped_text)

# 加载支持阿拉伯文的字体(替换为你本地的阿拉伯字体路径,比如Noto Naskh Arabic)
# Windows示例路径:"C:/Windows/Fonts/NotoNaskhArabic-Regular.ttf"
# Linux示例路径:"/usr/share/fonts/truetype/noto/NotoNaskhArabic-Regular.ttf"
font = ImageFont.truetype("NotoNaskhArabic-Regular.ttf", 12)

# 计算文本所需图片尺寸,避免裁剪
text_width, text_height = font.getsize(bidi_text)
img = Image.new('L', (text_width + 4, text_height + 4), 0)  # 'L'为灰度图,0是黑色背景
d = ImageDraw.Draw(img)

# 绘制白色文本(255为白色)
d.text((2, 2), bidi_text, font=font, fill=255)

# 保存位图或直接传给打印机
img.save('pil_arabic_text.png')

二、使用python-escpos打印位图

解决PIL的问题后,可直接将生成的位图发送到打印机:

from escpos.printer import Serial  # 根据连接方式选Serial/USB/Network

# 初始化打印机(示例为串口连接,按需调整参数)
p = Serial(devfile='/dev/ttyUSB0', baudrate=9600, bytesize=8, parity='N', stopbits=1, timeout=1)

# 打印位图并切纸
p.image('pil_arabic_text.png')
p.cut()
p.close()

三、编码相关说明

  • 你提到的b'\xd9\x85\xd8\xad\xd9\x85\xd8\xaf'是محمد的UTF-8编码结果,本身是正确的
  • 打印机或PIL默认字体不支持解析这些编码对应的阿拉伯字符,必须通过字体支持+文本排版处理才能显示正确字符

内容的提问来源于stack exchange,提问作者Mido

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 17:55:22