웹에서 한글 특수기호가 깨지는 현상 해결하기: '㈝' 문자를 중심으로
웹 개발을 하다 보면 ㈝
, ㈜
, ㉾
같은 한글 특수기호가 깨져서 표시되는 현상이 발생한다. 오늘은 ㈝
(오전) 문자를 중심으로 이 문제를 해결하는 방법을 알아보자.
목차
특수문자 이해하기
문제의 특수문자 정보
- 유니코드 코드 포인트:
U+321D
- 이름: Parenthesized Korean Character Ojeon
- 유니코드 버전: 4.0 (2003년 4월)
- 블록: Enclosed CJK Letters and Months (
U+3200 - U+32FF
) - 스크립트: Hangul (한글)
- 카테고리: Other Symbol (So)
문제 상황
아래 글을 읽다가 특수문자가 깨진 것을 발견했다. PC마다 정상 출력되거나 깨지는 등 다양한 케이스가 존재했다.
처음엔 Mac과 Windows의 차이로 생각했으나, Mac도 버전에 따라 정상 출력/깨짐이 다르게 나타났다.
한글 특수기호가 깨지는 주요 원인
1. 폰트의 특수기호 미지원
- 용량 최적화
- 웹폰트는 용량이 클수록 로딩 시간 증가
- 자주 쓰는 글자만 포함해 용량 축소
- 특수기호는 사용 빈도가 낮아 제외
- 폰트 제작 범위
- 기본 한글/영문 위주 제작
- 특수문자는 추가 비용/시간 필요
- 일부 폰트는 기본 문자셋만 지원
2. 시스템/브라우저 렌더링 차이
- OS별 렌더링 엔진
- Windows: DirectWrite (선명하고 날카로운 표현)
- macOS: Core Text (부드러운 곡선 처리)
- Linux: FreeType (설정별 다양한 렌더링)
- 브라우저별 처리
- Chrome: Skia 엔진
- Firefox: Cairo 엔진
- Safari: Core Graphics
3. 웹폰트 로딩 타이밍
- 폰트 다운로드 전에 텍스트 표시 시도
- 폰트 로딩 전 깨진 문자로 표시
해결 방안
1. 특수문자용 폰트 지정
@font-face {
font-family: 'SpecialCharFont';
src: url('font.woff') format('woff');
unicode-range: U+3200-32FF;
}
.text-container {
font-family: 'SpecialCharFont', 'Apple SD Gothic Neo',
'Malgun Gothic', sans-serif;
}
2. 폴백 처리
<span class="special-char" data-fallback="(오전)">㈝</span>
구현 예시
1. 폰트 지원 확인
function getFallbackChar(fontFamily) {
const canvas = document.createElement('canvas');
const ctx = canvas.getContext('2d');
ctx.font = `16px ${fontFamily}`;
const unsupportedUnicode = String.fromCodePoint(0x10FFFF);
const fallbackWidth = ctx.measureText(unsupportedUnicode).width;
const possibleFallbacks = ['□', '�', '?', '▯'];
const actualFallback = possibleFallbacks.find(char =>
ctx.measureText(char).width === fallbackWidth
);
return {
fallbackChar: actualFallback || unsupportedUnicode,
fallbackWidth: fallbackWidth
};
}
2. 폰트 로딩 처리
document.fonts.ready.then(() => {
const container = document.querySelector('.text-container');
const fontFamily = getComputedStyle(container).fontFamily;
const fonts = fontFamily.split(',').map(font => font.trim());
document.querySelectorAll('.special-char').forEach(char => {
const isSupported = fonts.some(font =>
checkFontSupport(char.textContent, font)
);
if (!isSupported) {
char.textContent = char.dataset.fallback;
}
});
});
결론
특수문자 깨짐 현상은 다음과 같이 해결할 수 있다:
- 유니코드 범위 파악과 적절한 폰트 선택
- 폰트 지원 여부 확인 로직 구현
- 안정적인 폴백 처리
참고 자료
'IT > 이것저것' 카테고리의 다른 글
[Unix/Linux] POSIX 기반 OS 에서 텍스트 파일 처리에 대한 고찰 (0) | 2025.01.03 |
---|---|
Cloudflare ICN 리전 사용에 관한 짧은 고찰 (0) | 2024.11.28 |
[ChatGPT] GPTs 커스텀 플러그인 만들기 (0) | 2024.04.04 |
[문서 생성기] 문서 생성 오픈소스 알아보기 (1) | 2024.03.12 |
[유니코드 정규화] 같은 글자가 중복으로 저장되거나 검색에서 누락 된다면 유니코드를 의심해보자 (0) | 2024.02.21 |