SELECT * FROM DOCUMENT_FILE
WHERE UID = 85
AND ORIGINAL_FILENAME LIKE '%가이드%';
*-- 결과: 0건 (실제 데이터 존재함)*
SELECT ORIGINAL_FILENAME, HEX(ORIGINAL_FILENAME) FROM RAG_DOCUMENT_FILE;
| 글자 | HEX |
|---|---|
| 가 | EAB080 |
| 이 | EC9DB4 |
| 드 | EB939C |
| 글자 | HEX | 구성 |
|---|---|---|
| 가 | E18480 E185A1 | ㄱ + ㅏ |
| 이 | E18480 E185B5 | ㅇ + ㅣ |
| 드 | E18483 E185B2 | ㄷ + ㅡ |
macOS는 파일명을 NFD (Normalization Form Decomposed) 형태로 저장함
가 → ㄱ + ㅏ)사용자가 macOS에서 파일을 업로드하면 NFD로 저장되고, 검색 시 키보드 입력은 NFC이므로 매칭되지 않는다.
[출처: 나무위키]
APFS는 파일 이름을 있는 그대로의 raw bytes를 저장하기에 유니코드 NFD, NFC 노멀라이제이션 방식에 상관없이 둘다 저장할 수 있다.
하지만 내부에서 모든 처리는 강제로 NFD로 이루어진다. 예를 들어, 파일 이름 조회 또는 변경 시 내부에서 무조건 NFD 형태로 변환하고 처리하도록 설계되어 있다. 따라서 NFC로 저장하더라도, 시스템 콜에는 NFD 노멀라이제이션을 적용하기에 한글 자모음 분리 현상이 나타날 수 있다.
import java.text.Normalizer;
*/**
* 파일명 정규화 (NFD -> NFC 변환, macOS 한글 자소 분리 문제 해결)
*/*
private String normalizeFilename(String filename) {
if (StringUtils.isBlank(filename)) {
return "unknown";
}
return Normalizer.normalize(filename, Normalizer.Form.NFC);
}
/**
* Normalize a sequence of char values.
* The sequence will be normalized according to the specified normalization
* form.
* @param src The sequence of char values to normalize.
* @param form The normalization form; one of
* {@link java.text.Normalizer.Form#NFC},
* {@link java.text.Normalizer.Form#NFD},
* {@link java.text.Normalizer.Form#NFKC},
* {@link java.text.Normalizer.Form#NFKD}
* @return The normalized String
* @throws NullPointerException If {@code src} or {@code form}
* is null.
*/
public static String normalize(CharSequence src, Form form) {
return NormalizerBase.normalize(src.toString(), form);
}
| 파라미터 | 설명 |
|---|---|
| src | 정규화할 문자열 |
| form | 정규화 형식 (NFC, NFD, NFKC, NFKD) |
| 반환값 | 정규화된 문자열 |
| Form | 이름 | 설명 | 예시 (가) |
|---|---|---|---|
| NFC | Canonical Composition | 분해 후 조합 (표준 조합형) | 가 → 가 (1글자) |
| NFD | Canonical Decomposition | 분해만 수행 | 가 → ㄱ + ㅏ (2글자) |
| NFKC | Compatibility Composition | 호환 분해 후 조합 | ℌ → H |
| NFKD | Compatibility Decomposition | 호환 분해만 수행 | fi → f + i |