当前位置: 首页 > news >正文

记一次 electron 添加 检测 终端编码,解决终端打印中文乱码问题

前言:

electron 终端打印中文乱码,但有些同事终端 编码 是 urf8 , 有些是 gbk,所以添加编码检测,保证所有人终端打印中文不乱码

采用了 winston 日志库
使用 iconv-lite 库来进行字符编码转换。

iconv-lite

1. 关键逻辑 (可以 cmd/powerShell 输入 chcp 查看当前编码集)

在这里插入图片描述
常见 Windows 代码页:

437 → 美国英语(OEM US)

936 → 简体中文(GBK/GB2312)

950 → 繁体中文(Big5)

65001 → UTF-8

判断代码:
    const output = execSync('chcp', { encoding: 'utf8' }).toLowerCase().trim();if (output.includes('65001')) {return 'utf8';}if (output.includes('936')) {return 'gbk';}

2.核心片段

/* eslint-disable @typescript-eslint/no-explicit-any */
import winston from 'winston';
import { format, TransformableInfo } from 'logform';
import DailyRotateFile from 'winston-daily-rotate-file';
import * as Transport from 'winston-transport';
import iconv from 'iconv-lite';
import { safeFormat } from 'shared/static.tools';
import { LogLevel } from 'shared/types';
import { DEFULT_LABEL } from './type';
import { execSync } from 'child_process';/*** 自动探测当前终端编码*/
type SupportedEncoding = 'utf8' | 'gbk';function detectEncoding(): SupportedEncoding {try {if (process.platform !== 'win32') {return 'utf8'; // macOS / Linux 默认 UTF-8}// Windows: 检查 code pageconst output = execSync('chcp', { encoding: 'utf8' }).toLowerCase().trim();if (output.includes('65001')) {return 'utf8';}if (output.includes('936')) {return 'gbk';}} catch {// 如果 execSync 出错,走默认}return 'utf8';
}/*** 自定义 ConsoleTransport:自动转码,解决 Windows 控制台中文乱码*/
class EncodedConsoleTransport extends Transport {private _encoding: SupportedEncoding;constructor(opts?: Transport.TransportStreamOptions) {super(opts);this._encoding = detectEncoding(); // 初始化时就探测好}override log(info: any, callback: () => void): void {setImmediate(() => this.emit('logged', info));let formatted = `${info.timestamp} [${info.level}]`;if (info.label && info.label !== DEFULT_LABEL) {formatted += ` [${String(info.label).substring(0, 9)}]`;}formatted += `: ${info.message}`;const encodedBuffer = iconv.encode(formatted + '\n', this._encoding);process.stdout.write(encodedBuffer);callback();}
}const consoleTransport = new EncodedConsoleTransport({level: 'debug',
});const transports: Transport[] = [consoleTransport];const winstonLogger = winston.createLogger({format: format.combine(format.timestamp({ format: 'HH:mm:ss.SSS' }),format.colorize(), // 不同等级 level 的日志上色(info=绿色,warn=黄色,error=红色)format.splat(), // 支持 %s, %d, %j 等格式化format.simple() // 简单格式化),transports: transports,
});

文章转载自:

http://mIyHqteu.gtzwz.cn
http://KpTZNjsp.gtzwz.cn
http://SEqH6iiF.gtzwz.cn
http://9kCSe8YD.gtzwz.cn
http://DaFBGMLl.gtzwz.cn
http://ucrNLyLU.gtzwz.cn
http://QLfoSB3w.gtzwz.cn
http://hPIzFtqP.gtzwz.cn
http://Z9uTm66s.gtzwz.cn
http://GaRzh8Og.gtzwz.cn
http://3v0qnNol.gtzwz.cn
http://GDWEEr2a.gtzwz.cn
http://ou01E8p2.gtzwz.cn
http://nEZmEM8M.gtzwz.cn
http://YJeKFvQI.gtzwz.cn
http://mPscAaCc.gtzwz.cn
http://lotijad2.gtzwz.cn
http://rOwIkm28.gtzwz.cn
http://9zwfCJGL.gtzwz.cn
http://l06ycV39.gtzwz.cn
http://LElEwgFh.gtzwz.cn
http://cLz7pRpo.gtzwz.cn
http://vbhH0faE.gtzwz.cn
http://9xE1MHh3.gtzwz.cn
http://cm9hloy7.gtzwz.cn
http://wGS3eRhn.gtzwz.cn
http://iGZXKdBV.gtzwz.cn
http://SVNrf6FK.gtzwz.cn
http://dNsfYSmS.gtzwz.cn
http://WHlBNjcl.gtzwz.cn
http://www.dtcms.com/a/375289.html

相关文章:

  • 从生活照料到精神关怀,七彩喜打造全场景养老服务体系
  • 2025-09-08升级问题记录: 升级SDK从Android11到Android12
  • BizDevOps 是什么?如何建设企业 BizDevOps 体系
  • 一、ARM异常等级及切换
  • 【项目复现】MOOSE-Chem 用于重新发现未见化学科学假说的大型语言模型
  • mybatis plus 使用wrapper输出SQL
  • PgSQL中优化术语HOT详解
  • Python 绘制 2025年 9~11月 P/1999 RO28 (LONEOS) 彗星路径
  • Spring Cloud Stream深度实战:发布订阅模式解决微服务通信难题
  • 【菜狗每日记录】深度轨迹聚类算法、GRU门控神经网络—20250909
  • OpenCV 实战:多角度模板匹配实现图像目标精准定位
  • C#/.NET/.NET Core技术前沿周刊 | 第 53 期(2025年9.1-9.7)
  • 基于Java+Vue开发的家政服务系统源码适配H5小程序APP
  • 使用Flask实现接口回调地址
  • Java线程中的sleep、wait和block:区别与联系详解
  • 生信软件管理, 容器-Singularity学习笔记
  • go webrtc - 2 webrtc重要概念
  • 智能驱动,全程可控——D-QS工程造价数字化平台核心功能深度解析
  • [硬件电路-170]:50Hz工频干扰:本质、产生机制与影响
  • tab切换动画,背景图向内收缩效果,主图片缓慢展开效果(含自适应)
  • 【内存管理】设置内存页表项 set_pte_at
  • Python中内置装饰器
  • 鸿蒙NEXT UI高性能开发实战:从原理到优化
  • 影视APP源码 SK影视 安卓+苹果双端APP 反编译详细视频教程+源码
  • Anthropic 支持加州 AI 安全法案
  • 【杂类】应对 MySQL 处理短时间高并发的请求:缓存预热
  • ubuntu 20.04 安装spark
  • 【企业微信】接口报错:javax.net.ssl.SSLHandshakeException
  • uniapp原生插件 TCP Socket 使用文档
  • 京东云-数据盘挂载