UTF-8 BOM과 PowerShell 파일 쓰기
이 글은 Today I Learn 시리즈의 52번째 기록입니다. (총 133개)
인코딩
BOM이란
BOM(Byte Order Mark)은 파일 맨 앞에 붙는 3바이트(EF BB BF)다. 원래 “이 파일은 UTF-8이에요”라고 알려주는 표시인데, UTF-8은 바이트 순서가 고정되어 있어서 사실 BOM이 없어도 알 수 있다. 그래서 요즘은 안 쓰는 게 표준이지만, Windows 생태계 일부 도구가 여전히 BOM을 기본으로 붙인다.
눈에 보이지 않아서 에디터에서는 멀쩡해 보여도 파일 내부는 이렇게 시작한다.
EF BB BF 2D 2D 2D ...
--- (frontmatter 시작)
Jekyll은 BOM 있는 파일의 frontmatter를 파싱하지 못한다
Jekyll은 파일이 ---으로 시작해야 frontmatter로 인식한다. BOM이 앞에 붙으면 파일이 EF BB BF ---로 시작하게 되어 Jekyll이 frontmatter를 찾지 못하고, 해당 포스트를 그냥 평문으로 처리한다. 결과적으로 포스트가 컬렉션에서 사라져 목록에서 보이지 않는다.
PowerShell
.NET의 UTF8 인코딩은 기본으로 BOM을 붙인다
PowerShell에서 파일을 쓸 때 흔히 쓰는 방식:
[System.IO.File]::WriteAllText($path, $content, [System.Text.Encoding]::UTF8)
System.Text.Encoding.UTF8은 .NET에서 BOM 포함 UTF-8이 기본이다. Obsidian이 BOM 없이 만든 파일을 이 방식으로 수정하면, 수정할 때마다 BOM이 추가된다.
BOM 없는 UTF-8로 쓰려면 다음과 같이 하면 된다.
$utf8NoBom = [System.Text.UTF8Encoding]::new($false)
[System.IO.File]::WriteAllText($path, $content, $utf8NoBom)
함정
BOM은 눈에 안 보이고 증상이 멀리서 나타난다
파일을 에디터로 열면 멀쩡하고, 로컬 Jekyll 빌드에서도 경고 없이 넘어가는 경우가 있다. 증상은 “포스트가 목록에서 안 보임”처럼 멀리서 나타나서 원인을 찾기 어렵다.
확인하려면 파일 첫 3바이트를 직접 확인해야 한다.
with open("file.md", "rb") as f:
print(f.read(3).hex()) # "efbbbf" 이면 BOM 있음
Series: Today I Learn
1
|
C++ 자료형(Data Type)
2
|
MD5 vs pHash
3
|
C++에서 함수의 선언과 정의
4
|
Tkinter padx, pady
5
|
메모리와 포인터 변수
6
|
Call by Value, Call by Reference, Call by Pointer 비교
7
|
const
8
|
Gemfile — Jekyll 프로젝트의 의존성 파일
9
|
kramdown-parser-gfm — Jekyll의 GFM 파서
10
|
파서(Parser)
11
|
AHU vs OHU
12
|
I might try it vs I'll try it 뉘앙스 차이
13
|
SESSION_EXPIRE_AT_BROWSER_CLOSE=True
14
|
configuration key
15
|
Git stash vs discard
16
|
subprocess.Popen으로 Windows 탐색기에 명령어를 전달
17
|
Post 잔디 분석하기
18
|
Google Sheets Sync 최적화
19
|
DSL (Domain Specific Language)과 GPL (General Purpose Language)
20
|
마크다운 표 그리는 방법
21
|
쿼리 파라미터(Query Parameter). 기존 QR코드 재활용
22
|
Django 보안 취약점 점검 및 수정
23
|
OOP Object-Oriented Programming 객체 지향 프로그래밍
24
|
Fernet 대칭 암호화
25
|
Jekyll 코드블록 안의 Liquid 태그
26
|
습관만들기 Pawbit TIL 1
27
|
insertOnConflictUpdate vs DoUpdate(target)
28
|
세션 필터
29
|
아코디언(Accordiaon) UI를 펼친상태로 만들기
30
|
input의 step
31
|
습관만들기 Pawbit TIL 2
32
|
습관만들기 Pawbit TIL 3
33
|
Word Cloud
34
|
Google Sheets를 데이터 버스로(with AppSheet)
35
|
Django 모델 텍스트 필드 자동 수집 패턴
36
|
localStorage로 섹션 토글 상태 유지
37
|
순차 ID 생성(`select_for_update()` + `max()` 조합)
38
|
역참조 검색과 distinct()
39
|
xlsx 다운로드와 로딩 오버레이 충돌
40
|
Android 파일 공유 MIME 타입
41
|
AssetManifest — Flutter 빌드 타임 asset 목록 런타임 조회
42
|
크레센도 Phaser + TypeScript TIL 1
43
|
크레센도 Phaser + TypeScript TIL 2
44
|
크레센도 Phaser + TypeScript TIL 3
45
|
크레센도 Phaser + TypeScript TIL 4
46
|
크레센도 Phaser + TypeScript TIL 5
47
|
여둘까 Office Layout TIL 1
48
|
습관만들기 Pawbit TIL 4
49
|
여둘까 Office Layout TIL 2
50
|
여둘까 Office Layout TIL 3
51
|
크레센도 Phaser + TypeScript TIL 6
52
|
UTF-8 BOM과 PowerShell 파일 쓰기
읽는 중
53
|
소리꽃 KeyBloom TIL 1
54
|
소리꽃 KeyBloom TIL 2
55
|
소리꽃 KeyBloom TIL 3
56
|
소리꽃 KeyBloom TIL 4
57
|
소리꽃 KeyBloom TIL 5
58
|
습관만들기 Pawbit TIL 5
59
|
여둘까 Office Layout TIL 4
60
|
소리꽃 KeyBloom TIL 6
61
|
소리꽃 KeyBloom TIL 7
62
|
소리꽃 KeyBloom TIL 8
63
|
메트로놈 Simple Metronome TIL 1
64
|
소리꽃 KeyBloom TIL 9
65
|
메트로놈 Simple Metronome TIL 2
66
|
소리꽃 KeyBloom TIL 10
67
|
습관만들기 Pawbit TIL 6
68
|
크레센도 Phaser + TypeScript TIL 7
69
|
메트로놈 Simple Metronome TIL 3
70
|
습관만들기 Pawbit TIL 7
71
|
정적 블로그 SEO 정비와 Pagefind 검색 도입
72
|
크레센도 Phaser + TypeScript TIL 8
73
|
메트로놈 Simple Metronome TIL 4
74
|
습관만들기 Pawbit TIL 8
75
|
안드로이드 AudioTrack 연속 재생, 실측 피커 정렬, 카메라 토치 플래시
76
|
메트로놈 Simple Metronome TIL 5
77
|
모래게임 Sandrop TIL 1
78
|
습관만들기 Pawbit TIL 9
79
|
메트로놈 Simple Metronome TIL 6
80
|
모래게임 Sandrop TIL 2
81
|
모래게임 Sandrop TIL 3
82
|
습관만들기 Pawbit TIL 10
83
|
습관만들기 Pawbit TIL 11
84
|
메트로놈 Simple Metronome TIL 7
85
|
모래게임 Sandrop TIL 4
86
|
모래게임 Sandrop TIL 5
87
|
습관만들기 Pawbit TIL 12
88
|
모래게임 Sandrop TIL 6
89
|
소리꽃 KeyBloom TIL 11
90
|
모래게임 Sandrop TIL 7
91
|
모래게임 Sandrop TIL 8
92
|
소리꽃 KeyBloom TIL 12
93
|
모래게임 Sandrop TIL 9
94
|
소리꽃 KeyBloom TIL 13
95
|
모래게임 Sandrop TIL 10
96
|
소리꽃 KeyBloom TIL 14
97
|
소리꽃 KeyBloom TIL 15
98
|
소리꽃 KeyBloom TIL 16
99
|
콘티온 Conti On TIL 1
100
|
소리꽃 KeyBloom TIL 17
101
|
콘티온 Conti On TIL 2
102
|
습관만들기 Pawbit TIL 13
103
|
콘티온 Conti On TIL 3
104
|
모래게임 Sandrop TIL 11
105
|
소리꽃 KeyBloom TIL 18
106
|
여둘까 Office Layout TIL 5
107
|
모래게임 Sandrop TIL 12
108
|
모래게임 Sandrop TIL 13
109
|
콘티온 Conti On TIL 4
110
|
모래게임 Sandrop TIL 14
111
|
소리꽃 KeyBloom TIL 19
112
|
소리꽃 KeyBloom TIL 20
113
|
소리꽃 KeyBloom TIL 21
114
|
소리꽃 KeyBloom TIL 22
115
|
습관만들기 Pawbit TIL 14
116
|
모래게임 Sandrop TIL 15
117
|
모래게임 Sandrop TIL 16
118
|
소리꽃 KeyBloom TIL 23
119
|
소리꽃 KeyBloom TIL 24
120
|
소리꽃 KeyBloom TIL 25
121
|
소리꽃 KeyBloom TIL 26
122
|
온실 GreenHouse TIL 1
123
|
콘티온 Conti On TIL 5
124
|
모래게임 Sandrop TIL 17
125
|
소리꽃 KeyBloom TIL 27
126
|
온실 GreenHouse TIL 2
127
|
콘티온 Conti On TIL 6
128
|
모래게임 Sandrop TIL 18
129
|
콘티온 Conti On TIL 7
130
|
모래게임 Sandrop TIL 19
131
|
소리꽃 KeyBloom TIL 28
132
|
모래게임 Sandrop TIL 20
133
|
모래게임 Sandrop TIL 21