.Net 7.0 에 WPF로 작성했습니다.
문제는 SerialPort 사용시, 인코딩, 속도등 모두 맞추었는데도, 한글출력시 깨집니다.
이전 .NetFramework 4.7 버전에서는 한글깨지지 않습니다.
해결방안이 있는지 궁금합니다.
.Net 7.0 에 WPF로 작성했습니다.
문제는 SerialPort 사용시, 인코딩, 속도등 모두 맞추었는데도, 한글출력시 깨집니다.
이전 .NetFramework 4.7 버전에서는 한글깨지지 않습니다.
해결방안이 있는지 궁금합니다.
어땋게 깨지는지라도 을려주셔야 도움을 드릴 수 있을것 같은데요
콘솔에다 출력을 해보시겠어요?
.NET 4.7에서는 된다면 특정 라이브러리가 멀티 타겟팅을 지원하지 않는다거나 아니면 또 다른 종속성 라이브러리에서 .NET Core와 호환이 안될 수도 있겠네요.
재현 가능한 샘플 코드가 있으면 좋을 것 같습니다.
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 을 사용하였습니다.
그냥 출력인데, 한글만 깨지네요~ㅜㅜ
고수님들의 경험을 공유해 주시면 감사하겠습니다.
Encoding.Default 로 하지 마시고 정활히 인코딩을 지정헤보세요
.NET 7.0에서 SerialPort
클래스는 일부 인코딩만 지원한다고 합니다.
EUC-KR을 지원하지 않는다고 합니다.
그래서
byte[] buffer = Encoding.GetEncoding("EUC-KR").GetBytes(text); // EUC-KR 인코딩 사용
serialPort.Write(buffer, 0, buffer.Length);
변환하여, 보냈습니다.
감사합니다. ^^
@JunHo_Mun 고생 많으셨습니다. 과정과 결과까지 자세하게 남겨 주셔서 다른 분들에게도 도움 많이 되겠어요, 고맙습니다!
.NET Framework에서는 Encoding.Default
가 시스템 인코딩을 따라가지만
.NET (Core)에서는 Encoding.Default
가 항상 UTF-8
을 반환합니다.
serialPort.Encoding = Encoding.GetEncoding("EUC-KR"); // 또는 (0)
하시면 될 것 같습니다.
오 요고는 몰랐던 것인데 정보 감사합니다 ㅎ
.NET Core는 기본적으로 일부 인코딩만 지원한다고 합니다. 그래서 EUC-KR 등의 인코딩을 사용하려면 따로 패키지를 설치해야 합니다.
저도 core3.1에서 깨진적이 있어서…
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
해당 줄을 생성자에 넣어놓고 사용하니 문제가 없어서 이대로 사용중입니다…!
저도 예전에 .net 6.0 으로 포스 프로그램 마이그레이션 할때 동일한 이슈 있었었는데 인코딩으로 해결 했었습니다.