본문 바로가기

비개발자의 개발 일지

현장 팀장에서 수출 ERP까지 — AI와 함께 시스템을 만든 기록

시리즈 보기
php

PHP mb_convert_encoding() — 인코딩 변환 · UTF-8 · EUC-KR 완전 정리

by 왕진 2026. 7. 11.
반응형

 

 

Web Development · PHP 문자열 인코딩 함수

PHP mb_convert_encoding() — 문자 인코딩을 변환하는 함수

UTF-8 ↔ EUC-KR 변환 · 한글 깨짐 해결 · 세 번째 인수 출발 인코딩 완전 정리
시작 오늘 분석할 코드

mb_convert_encoding()은 문자열의 인코딩을 변환하는 함수입니다. 첫 번째 인수로 변환할 문자열, 두 번째로 목적 인코딩, 세 번째로 출발 인코딩을 지정합니다. 세 번째 인수를 생략하면 내부 인코딩 설정으로 추측하는데, 이게 잘못되면 한글이 깨질 수 있어 명시하는 것이 안전합니다.

<?php $filename = "test.txt"; $contents = file_get_contents($filename); // UTF-8로 저장된 파일 내용을 EUC-KR로 변환 $converted = mb_convert_encoding($contents, "EUC-KR", "UTF-8"); // 목적 인코딩: EUC-KR // 출발 인코딩: UTF-8 (원본 파일의 인코딩) print $converted; ?>
실제 출력 미리보기
입력 (UTF-8)
안녕하세요
3바이트/글자 × 5 = 15bytes

EUC-KR
출력 (EUC-KR)
안녕하세요
2바이트/글자 × 5 = 10bytes
용어 용어 정리
mb_convert_encoding()문자열 인코딩 변환. 두 번째=목적, 세 번째=출발 인코딩
UTF-8유니코드 가변 길이 인코딩. 한글 1글자 = 3바이트. 현대 웹 표준
EUC-KR한글 전용 2바이트 인코딩. 구형 시스템·일부 레거시 환경에 사용
CP949EUC-KR 확장판. 윈도우 한글 인코딩. EUC-KR과 대부분 호환
mbstringPHP 멀티바이트 확장. mb_ 접두사 함수 제공. php.ini에서 활성화
출발 인코딩세 번째 인수 — 원본 문자열이 어떤 인코딩인지. 생략 시 자동 감지(불안정)
인코딩 감지mb_detect_encoding() — 문자열의 인코딩을 추측. 한글은 EUC-KR/UTF-8 혼동 가능
iconv()인코딩 변환 다른 함수. mb_convert_encoding과 유사하지만 동작 차이 있음

1 인수 순서 — 목적 먼저, 출발 나중
직관과 반대인 순서 — 꼭 기억해야 함

인수 순서가 헷갈리기 쉽습니다. 두 번째가 변환할 목적 인코딩, 세 번째가 원본의 출발 인코딩입니다. "어디로 → 어디서"가 아니라 "목적지, 출발지" 순서입니다.

// mb_convert_encoding($str, 목적, 출발) // UTF-8 → EUC-KR 변환 mb_convert_encoding($str, "EUC-KR", "UTF-8"); // EUC-KR → UTF-8 변환 (역방향) mb_convert_encoding($str, "UTF-8", "EUC-KR"); // 출발 인코딩 자동 감지 (한글에서 불안정 — 비권장) mb_convert_encoding($str, "UTF-8");
⚠️ 세 번째 인수를 생략하면 mb_detect_encoding()으로 추측하는데, 한글 EUC-KR과 UTF-8을 혼동하는 경우가 있어 반드시 명시하는 것이 좋습니다.

2 파일 읽기 + 인코딩 변환 전체 패턴
EUC-KR 파일을 읽어 UTF-8 페이지에서 출력
// EUC-KR 파일 → UTF-8 출력 $raw = file_get_contents("euckr_data.txt"); $utf8 = mb_convert_encoding($raw, "UTF-8", "EUC-KR"); echo $utf8; // UTF-8 페이지에서 한글 정상 출력 // UTF-8 문자열 → EUC-KR 파일 저장 $data = "저장할 한글 데이터"; $euckr = mb_convert_encoding($data, "EUC-KR", "UTF-8"); file_put_contents("legacy_file.txt", $euckr);

3 mb_detect_encoding — 인코딩 감지
출발 인코딩을 모를 때 추측 — 한글은 목록 명시 권장
// 인코딩 추측 $enc = mb_detect_encoding($str, ['UTF-8', 'EUC-KR', 'CP949'], true); // 세 번째 true = strict mode (더 정확) if ($enc) { $utf8 = mb_convert_encoding($str, 'UTF-8', $enc); } else { // 감지 실패 — UTF-8로 가정하고 진행 $utf8 = $str; }
※ 한글 환경에서는 UTF-8과 EUC-KR(CP949)을 목록에 명시하고 strict=true를 사용하는 것이 감지 정확도를 높입니다. 그래도 100%는 아니므로 가능하면 출발 인코딩을 미리 알고 있는 것이 최선입니다.

 

반응형

 

4 CSV 파일 인코딩 변환 처리
엑셀이 생성한 EUC-KR CSV를 PHP에서 UTF-8로 처리
// 엑셀 저장 CSV = EUC-KR 또는 CP949 $csv_raw = file_get_contents("data.csv"); $csv_utf8 = mb_convert_encoding($csv_raw, "UTF-8", "CP949"); // 변환 후 파싱 $rows = str_getcsv($csv_utf8, "\n"); foreach ($rows as $row) { echo implode(" | ", str_getcsv($row)) . "\n"; }

5 현대 PHP 권장 사항 — UTF-8 단일화
신규 시스템은 처음부터 UTF-8로 통일
인코딩 혼용 환경 (레거시)
DB: EUC-KR
파일: EUC-KR
HTML: UTF-8

→ mb_convert_encoding으로
  매번 변환 필요
→ 실수 시 한글 깨짐
UTF-8 단일화 (권장)
DB: utf8mb4
파일: UTF-8 (BOM 없이)
HTML: UTF-8

→ 변환 불필요
→ 한글 깨짐 위험 없음

6 자주 하는 실수
실수 증상 해결
세 번째 인수(출발 인코딩) 생략 자동 감지 실패 시 한글 깨짐 mb_convert_encoding($str, "UTF-8", "EUC-KR") 명시
목적·출발 순서 혼동 변환이 역방향으로 적용되어 더 깨짐 두 번째=목적, 세 번째=출발 — "어디로, 어디서"
mbstring 확장 미설치 Fatal error: Call to undefined function mb_convert_encoding() php.ini extension=mbstring 활성화
DB 연결 인코딩 미설정 PHP에서 변환해도 DB 입출력에서 깨짐 mysql_set_charset('utf8mb4') 또는 PDO charset 설정
이미 UTF-8인 문자열을 또 변환 이중 인코딩 → 한글 완전 파괴 mb_detect_encoding으로 확인 후 변환, 또는 단일 인코딩 환경 구성

핵심 한 줄 요약

mb_convert_encoding($s, $to, $from)인코딩 변환 — 두 번째=목적, 세 번째=출발
인수 순서 주의"목적지, 출발지" 순서 — 헷갈리기 쉬운 핵심 주의사항
한글 주요 인코딩UTF-8(현대), EUC-KR/CP949(레거시·엑셀·구형 DB)
출발 인코딩세 번째 인수 반드시 명시 — 생략 시 자동 감지 불안정
권장신규 시스템은 처음부터 UTF-8로 통일 — 변환 자체가 필요 없도록

Tags

#PHP #mb_convert_encoding #인코딩변환 #UTF-8 #EUC-KR #한글인코딩 #mbstring #PHP문자열함수 #PHP함수 #PHP학습 #웹개발 #티스토리
▼ 티스토리 태그 입력란 복사용
PHP, mb_convert_encoding, 인코딩변환, UTF-8, EUC-KR, 한글인코딩, mbstring, 문자인코딩, PHP문자열함수, PHP함수, PHP학습, 웹개발, 티스토리
반응형

댓글