.net 7.0에서 SerialPort 사용중인데~ 한글이 깨집니다.ㅜㅜ

.Net 7.0 에 WPF로 작성했습니다.

문제는 SerialPort 사용시, 인코딩, 속도등 모두 맞추었는데도, 한글출력시 깨집니다.

이전 .NetFramework 4.7 버전에서는 한글깨지지 않습니다.

해결방안이 있는지 궁금합니다.

3개의 좋아요

어땋게 깨지는지라도 을려주셔야 도움을 드릴 수 있을것 같은데요

콘솔에다 출력을 해보시겠어요?

2개의 좋아요

.NET 4.7에서는 된다면 특정 라이브러리가 멀티 타겟팅을 지원하지 않는다거나 아니면 또 다른 종속성 라이브러리에서 .NET Core와 호환이 안될 수도 있겠네요.

재현 가능한 샘플 코드가 있으면 좋을 것 같습니다.

1개의 좋아요
using System;
using System.IO.Ports;
using System.Text;

namespace ConsoleApp4
{
    internal class Program
    {
        static void Main(string[] args)
        {
            string portName = "COM1"; // 시리얼 포트 이름 (Linux 예시)
            int baudRate = 9600; // 통신 속도 설정
            Parity parity = Parity.None; // 패리티 설정
            int dataBits = 8; // 데이터 비트 설정
            StopBits stopBits = StopBits.One; // 정지 비트 설정

            // SerialPort 객체 생성
            using (SerialPort serialPort = new SerialPort(portName, baudRate, parity, dataBits, stopBits))
            {
                // 인코딩 설정 (한글을 포함한 문자를 전송할 때 필요)
                serialPort.Encoding = Encoding.Default; // 한글 인코딩

                // 포트 열기
                serialPort.Open();

                // 한글 문자열 전송                
                serialPort.WriteLine("가나다라마바사");
                serialPort.WriteLine(Convert.ToString((char)10));   //NewLine
                
                // 영문
                serialPort.WriteLine("ABCDEFGHIJKLM");
                serialPort.WriteLine(Convert.ToString((char)10));   //NewLine

                // 숫자
                serialPort.WriteLine("123456789");
                serialPort.WriteLine(Convert.ToString((char)10));   //NewLine

                // 특수문자
                serialPort.WriteLine("!@#$%^&*()");
                serialPort.WriteLine(Convert.ToString((char)10));   //NewLine

                Console.WriteLine("메시지를 전송했습니다: ");
            }
        }
    }
}

소스는 이렇게 되어있습니다.
단순 POS 시리얼프린터(ESC/POS지원프린터 - 빅솔론, 세우) 입니다.
.net 7.0은 System.IO.Ports (8.0.0)를 NuGet에서 설치하였고,
.net Framework 4.7.2는 자체 System.IO.Ports 을 사용하였습니다.

그냥 출력인데, 한글만 깨지네요~ㅜㅜ
고수님들의 경험을 공유해 주시면 감사하겠습니다.

2개의 좋아요

Encoding.Default 로 하지 마시고 정활히 인코딩을 지정헤보세요

3개의 좋아요

.NET 7.0에서 SerialPort 클래스는 일부 인코딩만 지원한다고 합니다.
EUC-KR을 지원하지 않는다고 합니다.
그래서

byte[] buffer = Encoding.GetEncoding("EUC-KR").GetBytes(text); // EUC-KR 인코딩 사용
serialPort.Write(buffer, 0, buffer.Length);

변환하여, 보냈습니다.
감사합니다. ^^

4개의 좋아요

@JunHo_Mun 고생 많으셨습니다. 과정과 결과까지 자세하게 남겨 주셔서 다른 분들에게도 도움 많이 되겠어요, 고맙습니다!

2개의 좋아요

.NET Framework에서는 Encoding.Default가 시스템 인코딩을 따라가지만
.NET (Core)에서는 Encoding.Default가 항상 UTF-8을 반환합니다.

serialPort.Encoding = Encoding.GetEncoding("EUC-KR"); // 또는 (0)

하시면 될 것 같습니다.

5개의 좋아요

오 요고는 몰랐던 것인데 정보 감사합니다 ㅎ

3개의 좋아요

.NET Core는 기본적으로 일부 인코딩만 지원한다고 합니다. 그래서 EUC-KR 등의 인코딩을 사용하려면 따로 패키지를 설치해야 합니다.

https://www.sysnet.pe.kr/2/0/13506

6개의 좋아요

저도 core3.1에서 깨진적이 있어서…
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
해당 줄을 생성자에 넣어놓고 사용하니 문제가 없어서 이대로 사용중입니다…!

3개의 좋아요

저도 예전에 .net 6.0 으로 포스 프로그램 마이그레이션 할때 동일한 이슈 있었었는데 인코딩으로 해결 했었습니다.