From 87c2fd8f14d065619bcffe01afe9db4a134bc2b7 Mon Sep 17 00:00:00 2001 From: hjjeong Date: Tue, 4 Nov 2025 14:00:46 +0900 Subject: [PATCH] =?UTF-8?q?"=3F"=20=EC=9E=85=EB=A0=A5=EC=8B=9C=20=EC=9D=B8?= =?UTF-8?q?=EC=BD=94=EB=94=A9=20=EC=98=A4=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/com/pms/service/PartMngService.java | 34 ++++++++++++++++--------- 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/src/com/pms/service/PartMngService.java b/src/com/pms/service/PartMngService.java index d632dfe..56d899f 100644 --- a/src/com/pms/service/PartMngService.java +++ b/src/com/pms/service/PartMngService.java @@ -3157,40 +3157,50 @@ public class PartMngService extends BaseService { // 시도할 인코딩 목록 (Windows Excel CSV 기본 인코딩 우선) String[] encodings = {"CP949", "UTF-8", "EUC-KR", "MS949"}; + String bestEncoding = "UTF-8"; // 기본값 + int minReplacementChars = Integer.MAX_VALUE; + for (String encoding : encodings) { try (FileInputStream fis = new FileInputStream(file); InputStreamReader isr = new InputStreamReader(fis, encoding); BufferedReader br = new BufferedReader(isr)) { - // 처음 몇 줄을 읽어서 깨진 문자 여부 확인 + // 처음 몇 줄을 읽어서 깨진 문자 개수 확인 String line; int lineCount = 0; - boolean hasBrokenChar = false; + int replacementCharCount = 0; while ((line = br.readLine()) != null && lineCount < 10) { - // 깨진 문자 검사 (� 또는 replacement character) - if (line.contains("\uFFFD") || line.contains("?")) { - hasBrokenChar = true; - break; + // replacement character (\uFFFD) 개수 세기 + for (int i = 0; i < line.length(); i++) { + if (line.charAt(i) == '\uFFFD') { + replacementCharCount++; + } } lineCount++; } - // 깨진 문자가 없으면 이 인코딩이 올바른 것으로 판단 - if (!hasBrokenChar && lineCount > 0) { - System.out.println("CSV 인코딩 감지 성공: " + encoding); + // 깨진 문자가 없으면 바로 이 인코딩 사용 + if (replacementCharCount == 0 && lineCount > 0) { + System.out.println("CSV 인코딩 감지 성공: " + encoding + " (깨진 문자 없음)"); return encoding; } + // 깨진 문자가 가장 적은 인코딩 기억 + if (replacementCharCount < minReplacementChars) { + minReplacementChars = replacementCharCount; + bestEncoding = encoding; + } + } catch (Exception e) { // 이 인코딩으로 읽기 실패 시 다음 인코딩 시도 continue; } } - // 모든 시도 실패 시 기본값 UTF-8 반환 - System.out.println("CSV 인코딩 감지 실패, 기본값 UTF-8 사용"); - return "UTF-8"; + // 가장 적은 깨진 문자를 가진 인코딩 사용 + System.out.println("CSV 인코딩 감지 완료: " + bestEncoding + " (replacement chars: " + minReplacementChars + ")"); + return bestEncoding; } /**