자주 묻는 질문

한글 인코딩 깨짐과 복구에 관한 15개 질문.

Q1. EUC-KR 과 CP949 의 차이는 무엇인가요?
EUC-KR 은 1987년 표준화된 한글 2,350자의 완성형 인코딩이고, CP949 는 Microsoft 가 1996년 여기에 8,822자를 추가 확장한 Windows 한국어 기본 코드 페이지입니다. 대부분의 문자는 두 인코딩에서 동일한 바이트지만, "뷁, 똠방" 같은 확장 한글은 CP949 에만 있습니다. 실무에서 "EUC-KR" 이라 부르는 것 대부분이 사실 CP949 입니다.
Q2. 제가 붙여넣은 텍스트가 서버로 전송되나요?
아니요. 모든 복구 로직은 페이지에 로드된 브라우저의 TextEncoder / TextDecoder API 로 실행됩니다. 페이지가 한 번 로드되면 네트워크를 끊어도 동작합니다. 개발자 도구의 Network 탭을 열고 입력해 보면 업로드 트래픽이 전혀 없는 것을 확인할 수 있습니다.
Q3. ZIP 파일 안의 한글 파일명이 깨졌습니다. 이 툴로 한번에 복구할 수 있나요?
현재 버전은 깨진 문자열 1건을 입력하는 단건 복구 전용입니다. 파일명을 하나씩 붙여넣어 복구 후보를 받고 수동으로 개명하세요. 대량 ZIP 파일명 일괄 복구는 macOS 의 unar, 크로스플랫폼 7z e -scrc, Windows 의 BandiZip 한국어 모드가 더 편합니다. 일괄 처리 전용 파생 툴은 로드맵에 있습니다.
Q4. 왜 후보를 1개가 아니라 5개나 보여주나요?
짧은 문자열이나 이중 변환된 문자열은 점수가 동률이거나 1·2위 차이가 작습니다. 강제로 1위만 보여주면 틀린 답을 내미는 경우가 잦아 상위 5개를 모두 노출하고 사용자가 맥락에 맞는 것을 고르게 합니다. 후보 옆의 "점수" 는 한글 음절 비율 + ASCII 정상성에서 U+FFFD 치환 문자와 라틴 확장 영역 비율을 뺀 값입니다.
Q5. U+FFFD (�) 가 들어간 문자열도 복구되나요?
복구할 수 없습니다. U+FFFD 는 "이 바이트는 이미 디코딩 실패로 버려졌다" 는 유니코드의 공식 치환 문자입니다. 원본 바이트가 존재하지 않으므로 어떤 툴로도 복원 불가능합니다. 깨짐이 발생하기 이전 단계(원본 파일, 원본 URL, 원본 DB row)에서 가져오세요.
Q6. URL 에 %EC%95%88%EB%85%95 같은 문자열이 있어요. 어떻게 복구하나요?
그대로 입력창에 붙여넣으면 됩니다. 이 툴은 %XX 패턴을 감지해 바이트 배열로 변환 후 UTF-8/EUC-KR 로 디코딩해 후보에 포함시킵니다. 이중 인코딩(%25EC%2595%2588…) 도 자동 감지해 2단계 디코딩을 시도합니다.
Q7. 이메일 제목이 =?UTF-8?B?...?= 로 옵니다. 디코딩되나요?
현재 버전은 MIME encoded-word (RFC 2047) 의 Base64 부분을 자동으로 풀지 않습니다. ?B? 뒤의 Base64 문자열만 따로 Base64 디코더로 푼 뒤, 그 결과(또는 바이트 표현)를 이 툴에 넣으세요. encoded-word 자동 파싱은 로드맵에 있습니다.
Q8. 복구 결과가 여전히 깨져 보입니다. 왜인가요?
가능성 3가지: (1) 깨짐 체인이 3단계 이상이라 2개의 인코딩 조합만으로는 복원 불가, (2) 문자열에 U+FFFD 가 섞여 있어 바이트가 이미 손실, (3) 실제로는 한자·일본어가 섞여 있어 한글 점수가 낮게 나옴. 1번의 경우 결과를 다시 입력창에 넣고 한 번 더 복구를 시도하면 풀리기도 합니다.
Q9. 한자·일본어가 섞여 있는 경우에도 쓸 수 있나요?
가능합니다. 점수 함수는 한글 음절 비율이 가장 크게 반영되지만 CJK 공통 영역도 양의 가중치를 가집니다. 다만 순수 일본어 mojibake 는 일본어 전용 툴(예: ftfy, 프로젝트 예정인 일본어 mojibake 복구기)이 더 정확합니다.
Q10. 공유 URL 복사 버튼은 어디에 쓰나요?
입력창의 깨진 문자열을 ?q= 파라미터에 그대로 실어 공유 URL 을 만듭니다. 동료에게 "이거 어떻게 복구돼?" 하고 전달할 때 유용합니다. 주의: 민감한 데이터는 URL 에 실리므로 공유 범위에 신중하세요.
Q11. MySQL 에서 한글이 안녕 으로 보입니다. 어떤 조합인가요?
원본은 UTF-8 바이트 (EC 95 88 EB 85 95) 인데 클라이언트가 Latin-1 로 해석한 고전적 케이스입니다. 이 툴의 첫 번째 후보 "UTF-8 → Latin-1" 이 정확히 이를 풀어줍니다. 근본 해결은 SET NAMES utf8mb4 또는 connection charset 을 고치세요.
Q12. 한글 자모가 분리된 (ㅇㅏㄴㄴㅕㅇ) 문자열도 복구되나요?
인코딩 단계의 깨짐이 아니라 유니코드 정규화(NFD) 이슈이므로 별도 경로가 필요합니다. 입력이 NFD 분리 자모라고 감지되면 향후 버전에서 normalize("NFC") 복원 후보를 추가할 예정입니다. 임시 해결로는 JavaScript 콘솔에서 "ㅇㅏㄴㄴㅕㅇ".normalize("NFC") 를 실행하면 됩니다.
Q13. 업무에 활용해도 괜찮나요?
텍스트가 서버로 전송되지 않으므로 사내 데이터에 활용해도 안전합니다. 다만 공유 URL 기능을 쓰면 URL 에 원문이 실리므로, 개인정보·영업비밀이 포함된 경우 공유 URL 은 사용하지 마세요.
Q14. 모바일에서도 쓸 수 있나요?
네. iOS Safari, 안드로이드 Chrome, 삼성 인터넷 모두 TextEncoder/TextDecoder 를 지원합니다. 복사 버튼은 iOS 16+ 에서 navigator.clipboard API 로 동작합니다.
Q15. 오픈소스인가요?
현재는 소스 공개 전이지만 핵심 복구 로직은 src/lib/encodingFixer.ts 한 파일에 들어 있으며 표준 브라우저 API 만 사용합니다. 개별 요청이 많으면 공개를 검토하겠습니다.