ChatGPT 의 코딩 실력을 확인하는 목적과 Shift 코딩 연습을 목적으로 맥용 프로그램을 만들어 보았다.
◼︎ 개발 환경- HW : MacBook Pro (14-inch, 2021)
- CPU : Apple M1 Pro
- MENORY : 16GB
- DISK : 512 GB SSD
- OS : macOS 15.0.1 (24A348)
- TOOLS : XCode 16.1
- Programming Language : Shift
◼︎ 프로그램 요구사항
맥은 UTF-8 NFD (Normalization Form Decomposed)로 저장하는 반면, 윈도우는 UTF-8 NFC (Normalization Form Composed)를 사용 하는 차이로 인하여 맥에서 생성된 파일이 윈도우로 이동하면 자모가 분리되어 보여지는 현상이다. 이를 해결하기 위하여 아래와 같은 목표를 정의했다.
- Drag&Drop 기능을 활용
- 자소가 분리된(NFD) 유니코드 파일명을 자소가 조합된(NFC) 파일명으로 변환
어떻게 프로그램을 만들 것인가
프로젝트 생성
"Namenizer" 프로그램 코딩
func isNFC(_ string: String) -> Bool {
return string == string.precomposedStringWithCanonicalMapping
}
/// 문자열이 NFD로 정규화된 상태인지 확인하는 함수
public static func isNFDUsingUnicodeScalars(_ string: String) -> Bool {
// NFD로 변환된 문자열
let nfdString = string.decomposedStringWithCanonicalMapping
// 원본 문자열과 NFD로 변환된 문자열의 유니코드 스칼라를 비교
return string.unicodeScalars.elementsEqual(nfdString.unicodeScalars)
}
func convertFileNameToNFCUsingPerl(_ url: URL) {
let originalPath = url.path
let directory = url.deletingLastPathComponent().path
let fileName = url.lastPathComponent
let perlCommand = """
/usr/bin/perl -CIO -MUnicode::Normalize -e 'rename shift, shift' "\(originalPath)" "\(directory)/$(/usr/bin/perl -CIO -MUnicode::Normalize -e 'print NFC(shift)' "\(fileName)")"
"""
let process = Process()
process.executableURL = URL(fileURLWithPath: "/bin/zsh") // 또는 "/bin/bash"
process.arguments = ["-c", perlCommand]
let pipe = Pipe()
process.standardOutput = pipe
process.standardError = pipe
do {
try process.run()
process.waitUntilExit()
let data = pipe.fileHandleForReading.readDataToEndOfFile()
if let output = String(data: data, encoding: .utf8) {
print(output)
}
if process.terminationStatus == 0 {
print("파일 이름이 NFC로 변환되었습니다.")
} else {
print("perl 명령어 실행 실패")
}
} catch {
print("파일 이름 변환 실패: \(error.localizedDescription)")
}
}
mv 스크립트를 생성하여 실행하는 방식은 정상 동작하고 perl 스크립트 방식에서는 잘못된 문자들로 저장되는 원인을 물어보았으나 이부분에 대한 명확한 답변을 듣지 못했다. 다만 아래와 같은 mv 가 좀더 신뢰성 있게 동작한다는 답변을 얻었다.