[.NETCore] / [.Net6] 使用 Big5 中文編碼 + [String 轉 Big5 Byte Array/C# 熱敏印表機 中文列印]

[.NETCore] / [.Net6] 使用 Big5 中文編碼 + [String 轉 Big5 Byte Array/C# 熱敏印表機 中文列印]

[.NETCore] / [.Net6] 使用 Big5 中文編碼 + [String 轉 Big5 Byte Array/C# 熱敏印表機 中文列印]


資料來源: https://harry-lin.blogspot.com/2019/05/net-core-big5.html


GITHUB: https://github.com/jash-git/CS_RS232_ESC_Command_Project


★解決 [.NETCore] / [.Net6] 使用 Big5 中文編碼 問題

    01.當使用 .Net Core/.Net6 執行 Encoding.GetEncoding(“big5”)時會發生Exception

System.ArgumentException: ''big5' is not a supported encoding name. For information on defining a custom encoding, see the documentation for the Encoding.RegisterProvider method.'


    02.透過 nuget 進行安裝 System.Text.Encoding.CodePages

    03.在程式進入點,引用該功能

 Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);


String 轉 Big5 Byte Array [C# 熱敏印表機 中文列印]

using System.IO.Ports;
using System.Text;

namespace CS_RS232_ESC_Command
{
    public partial class Form1 : Form
    {
        public int POS_S_TextOut(String StrMsg)
        {
            byte[] Command00 = new byte[3] { 0x1B, 0x39, 0x03 };//ESC,9,1 ~ 选择中文代码格式,1:UTF-8编码 ,3:BIG5 繁体编码
            var charMsg = StrMsg.ToCharArray();
            byte[] Command01 = Encoding.GetEncoding("big5").GetBytes(charMsg);
            //byte[] Command00 = new byte[3] { 0x1B, 0x39, 0x01 };//ESC,9,1 ~ 选择中文代码格式,1:UTF-8编码 ,3:BIG5 繁体编码
            //var charMsg = StrMsg.ToCharArray();
            //byte[] Command01 = Encoding.GetEncoding("utf-8").GetBytes(charMsg);
            //Array.Reverse(Command01);
            if (m_port.IsOpen)
            {
                m_port.Write(Command00, 0, Command00.Length);
                m_port.Write(Command01, 0, Command01.Length);

            }
            return 0;
        }
        public int POS_CutPaper()
        {
            byte[] Command = new byte[4] { 0x1D, 0x56, 0x41, 0x00 };//GS,V,A,空字元 ~ 选择切纸模式并切纸
            if (m_port.IsOpen)
            {
                m_port.Write(Command, 0, Command.Length);
            }
            return 0;
        }
        public int POS_Reset()
        {
            byte[] Command = new byte[2] { 0x1B,0x40};//ESC,@ ~ 初始化打印机
            if (m_port.IsOpen)
            {
                m_port.Write(Command, 0, Command.Length);
            }
            return 0;
        }
        public int POS_FeedLine()
        {
            byte[] Command = new byte[1] { 0x0A};//LF ~ 換行鍵
            if (m_port.IsOpen)
            {
                m_port.Write(Command, 0, Command.Length);
            }
            return 0;
        }
        public SerialPort m_port = new SerialPort();
        public Form1()
        {
            InitializeComponent();
        }
        public void CommDataReceived(Object sender, SerialDataReceivedEventArgs e)
        {
            //https://www.cnblogs.com/xinaixia/p/6216745.html
            try
            {
                //Comm.BytesToRead中为要读入的字节长度
                int len = m_port.BytesToRead;
                Byte[] readBuffer = new Byte[len];
                m_port.Read(readBuffer, 0, len); //将数据读入缓存
                //处理readBuffer中的数据,自定义处理过程
            }
            catch (Exception ex)
            {
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
            if (!m_port.IsOpen)
            {
                m_port.PortName = "COM3";
                m_port.BaudRate = 19200;
                m_port.DataBits = 8;
                m_port.StopBits = StopBits.One;
                m_port.Parity = Parity.None;
                m_port.ReadTimeout = 1;
                m_port.ReadTimeout = 3000; //单位毫秒
                m_port.WriteTimeout = 3000; //单位毫秒
                //串口控件成员变量,字面意思为接收字节阀值,
                //串口对象在收到这样长度的数据之后会触发事件处理函数
                //一般都设为1
                m_port.ReceivedBytesThreshold = 1;
                m_port.DataReceived += new SerialDataReceivedEventHandler(CommDataReceived); //设置数据接收事件(监听)
                m_port.Open();
                button1.Text = "Disconnect";
            }
            else
            {
                button1.Text = "Connect";
                m_port.Close();
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (!m_port.IsOpen)
            {
                m_port.PortName = "COM3";
                m_port.BaudRate = 19200;
                m_port.DataBits = 8;
                m_port.StopBits = StopBits.One;
                m_port.Parity = Parity.None;
                m_port.ReadTimeout = 1;
                m_port.ReadTimeout = 3000; //单位毫秒
                m_port.WriteTimeout = 3000; //单位毫秒
                //串口控件成员变量,字面意思为接收字节阀值,
                //串口对象在收到这样长度的数据之后会触发事件处理函数
                //一般都设为1
                m_port.ReceivedBytesThreshold = 1;
                m_port.DataReceived += new SerialDataReceivedEventHandler(CommDataReceived); //设置数据接收事件(监听)
                m_port.Open();
                button1.Text = "Disconnect";
            }
            else
            {
                button1.Text = "Connect";
                m_port.Close();
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            POS_Reset();
            POS_FeedLine();
            POS_FeedLine();
            POS_S_TextOut("Good morning");
            POS_FeedLine();
            POS_S_TextOut("早安");
            POS_FeedLine();
            POS_S_TextOut("おはようございます");
            POS_FeedLine();
            POS_FeedLine();
            POS_FeedLine();
            POS_FeedLine();
            POS_FeedLine();
            POS_FeedLine();
            POS_CutPaper();
        }
    }
}

2 thoughts on “[.NETCore] / [.Net6] 使用 Big5 中文編碼 + [String 轉 Big5 Byte Array/C# 熱敏印表機 中文列印]

  1. 如果要用C# 做RS232控制的人注意了

    今天發現VS2022又把對應元件移除在基本系統之外,要使用必須 nuget 進行安裝 System.IO.Ports

    PS. VS2015是內建的

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *