요새 뜬금없이 프론트를 하고 있습니다. 그래서 Rust 한글 깨짐 문제 해결 태스크가 주어졌습니다.
여담이지만 프론트 담당은 처음 해봤는데, 디자인적인 디테일을 구현하는 게 너무 재밌어요. PPT 외주받을 땐 이런 작업이 너무 귀찮았는데 지금은 아주 재밌네요? PPT 외주는 맨땅에 헤딩하면서 농협중앙회 주관 농업교육 자료부터 모은행 VIP 대상 부동산 컨설팅 자료까지 만들었던!! 참 흥미롭고 값진 경험이었지만 돈 안되는 프로그래밍이 더 좋아잉. 역시 마우스 안 써도 되는 컴퓨터 활동이면 사족을 못 쓰는 여자답지요.
머 암튼 Rust를 사용해 GUI 애플리케이션을 개발하다 보면, 한글이 제대로 표시되지 않고 네모(□)로 나오는 문제가 발생합니다. 이건 Rust에서 제공하는 기본 폰트가 한글을 지원하지 않기 때문입니다. (출처: 여러 네티즌의 뇌피셜)
ui.label("안녕하세요! 한글 테스트입니다.");이런 코드를 입력하면 결과는
□□□□□□□! □□□□□□.이런 식입니다. 심지어 키보드 인풋도 자음 모음 가릴 것 없이 전부 네모로 나옵니다. 이런 Rust 한글 깨짐 문제를 해결하는 방법은 다음과 같습니다.
Step 1: 한글 폰트 파일 준비
먼저, 한글을 지원하는 폰트를 다운로드하여 프로젝트에 추가해야 합니다. 여기서는 Noto Sans CJK KR을 사용했습니다.
1. 다운로드한 NotoSansKR-Regular.ttf 파일을 프로젝트 내 assets/fonts/ 폴더에 저장합니다.
Step 2: 사용자 정의 폰트 설정 함수 작성
main.rs 파일에 폰트를 설정하는 함수를 작성합니다. egui::FontDefinitions를 사용해 폰트를 등록하고, 애플리케이션 전체에서 사용할 수 있도록 적용합니다.
use egui::{FontDefinitions, FontFamily, Context};
fn configure_fonts(ctx: &Context) {
let mut fonts = FontDefinitions::default();
// 한글 폰트 파일 추가
fonts.font_data.insert(
"NotoSansKR".to_owned(),
egui::FontData::from_static(include_bytes!("../assets/fonts/NotoSansKR-Regular.ttf")),
);
// 기본(Proportional) 및 고정(Monospace) 폰트 패밀리에 추가
fonts.families.get_mut(&FontFamily::Proportional).unwrap().insert(0, "NotoSansKR".to_owned());
fonts.families.get_mut(&FontFamily::Monospace).unwrap().insert(0, "NotoSansKR".to_owned());
// 변경된 폰트를 egui 컨텍스트에 적용
ctx.set_fonts(fonts);
}Step 3: 초기화 시 폰트 설정 호출
애플리케이션을 초기화하는 부분에서 configure_fonts 함수를 호출하여 폰트를 적용합니다.
저는 main.rs 파일에서 App::new 함수에 아래에서 호출했습니다.
impl App {
pub fn new(ctx: &Context) -> Self {
// 한글 폰트 설정
configure_fonts(ctx);
// 기존 초기화 코드
}
}레딧이랑 스택오버플로우, GPT 답변을 참고해서 제일 쉬워보이는 걸로 해봤는데 바로 구현이 돼서 다른 방법은 시도를 안 해봤습니다. 내일 모레 토익 시험이라서요.
4. WebAssembly(WASM) 환경에서 폰트 추가
만약 애플리케이션을 WebAssembly(WASM)로 빌드하여 브라우저에서 실행한다면, 폰트 파일도 정적 리소스로 포함되어야 합니다.
1. assets/fonts/ 폴더를 WASM 빌드 환경에 포함되도록 설정합니다.
2. 브라우저에서 폰트를 로드할 수 있는 경로를 확인하세요.
이렇게 하면 Rust 한글 깨짐 문제가 해결될 거예요.
한글 지원이 필요한 Rust 개발자에게 도움이 되길 바랍니다! 😊
끝!
안녕! 에러 없는 하루 되세요.

![[KakaoTech] 이론기간 회고 | 기술에 대한 명확한 이해와 반복숙달](https://icecreamzoa.com/wp-content/uploads/2025/03/image-6.png)

답글 남기기