Upgrade to Pro — share decks privately, control downloads, hide ads and more …

iOS CMP의 한글 입력 버그 수정 기여하기

Sponsored · SiteGround - Reliable hosting with speed, security, and support you can count on.

iOS CMP의 한글 입력 버그 수정 기여하기

Avatar for Chanjung Kim

Chanjung Kim

August 17, 2026

More Decks by Chanjung Kim

Other Decks in Programming

Transcript

  1. Kotlin User Groups Seoul KotlinConf Extended 20 26 FEATURED SESSION

    iOS CMP 의 의의 의의 의의 의의 의의의의 의의의
  2. 의의 1. 컴컴컴컴 컴컴컴 컴컴컴 컴컴컴 컴컴컴 컴컴컴컴컴 • CMP

    1.5 컴컴 컴컴컴 컴컴컴컴 컴컴컴컴 컴컴 컴컴 컴컴 JetBrains/compose - multiplatform - core#718 2. 컴컴 컴컴 컴컴컴 컴 컴컴컴 컴컴컴컴 의 컴컴컴컴 • CMP 1.6.10 컴컴 컴컴 컴컴컴 plural strings 컴컴컴 JetBrains/compose - multiplatform#4519 3. 컴컴컴컴컴 컴컴 컴컴 컴컴 컴컴컴컴 • Noto Sans CJK 컴 컴 SC, TC, HK, JP, KR 4. 컴컴컴컴 컴컴 컴컴컴 컴컴컴컴컴 컴컴컴 컴컴컴컴컴컴 • iOS CMP 컴 Android Compose 컴컴 line break 컴 컴컴컴 5. 컴 Kotlin Multiplatform 컴컴컴 (2.4.10) 컴 컴컴컴 컴컴컴컴 컴컴 컴컴컴컴 /locale 컴컴 컴컴
  3. 의의의 의의 컴컴컴컴컴컴 ▪ CMP 1.4 컴컴 컴컴 → CMP

    1.6 ( 컴컴 ) 컴 컴컴 ▪ 컴컴 컴컴 CMP 1.11 / 컴컴 컴컴컴 Rust wgpu ▪ 컴컴 DAU 6 컴
  4. 의의의의 : 의의의의 • 컴컴 컴컴컴컴컴 의의의의 의의 의의 (Windows

    XP 컴컴 ) PS/2 컴컴컴 • PS/2 컴 interrupt - driven I/O컴 컴컴컴컴 • 컴컴 컴컴컴 • 컴컴컴 CPU 컴 컴컴 컴컴컴컴컴 USB 컴 컴컴컴컴 PS/2 컴컴컴 https:// commons.wikimedia.org https:// commons.wikimedia.org 컴컴컴 컴컴컴컴 컴컴컴 컴 컴컴컴컴 . 컴컴컴컴 , DMA 컴 컴컴컴컴 . . 컴컴컴컴 . HID 컴컴 컴컴컴컴컴 컴컴 /wiki/File:PS2_keyboard_and_mouse_jacks.jpg /wiki/File:Usb_connectors.JPG USB 컴컴컴 컴컴
  5. 의의의의 : 의의의의 의의의의 의의 의의 컴컴 USB 컴컴컴컴컴 컴컴컴컴

    컴컴 M. Kinugawa & D. Fujimoto, ”Electromagnetic Inforation Extortion from Electronic Devices Using Interceptor and Its Countermeasure”, IACR Transactions on Cryptographic Hardware and Embedded Systems , vol. 2019, no. 4, pp. 62 - 90, 2019.
  6. 의의의의 : 의의의의 의의의의 • USB host controller 컴 컴컴컴컴

    • 컴컴컴컴 컴컴 컴컴 HID 컴컴컴 • 컴컴 컴컴컴컴 • 컴컴컴컴컴 AI컴 컴컴컴 컴컴컴 컴컴컴컴컴 컴컴컴컴 DMA 컴 컴컴 컴컴컴 컴컴컴컴컴 컴컴컴 의의 의의 . 컴 컴컴컴컴 컴 컴컴컴 polling 컴컴 . . HID 컴컴컴 컴컴컴컴컴컴컴 컴컴컴컴 .
  7. Input Method Editor 의 의의의 • 컴컴컴컴 컴컴컴 컴컴컴컴컴 ,

    컴컴 컴컴컴 • 컴컴컴 컴컴컴컴 ? → 컴컴컴컴 컴컴컴 • HID 컴 컴컴컴컴 컴컴컴 컴컴컴 컴컴컴컴컴 • IME컴 컴 컴컴컴 컴컴 컴컴컴 컴컴컴컴컴 컴컴컴컴컴 https:// commons.wikimedia.org 컴컴컴 컴컴컴 컴컴컴컴컴 컴컴 HID 컴컴컴 컴컴컴 컴컴컴컴 . 컴컴컴컴컴컴 컴컴컴컴 컴컴컴컴 AZERTY . /wiki/File:KB _- _AZERTY_ - _FR_- _Windows_ - _FR.png . .
  8. Input Method Editor 의 의의의 • 컴컴 , HID 컴컴

    컴컴컴 컴컴 컴컴컴 • 컴컴컴컴 컴컴컴컴 컴컴 : 컴컴컴 컴컴컴컴컴 CJK 컴컴컴 컴컴컴 컴컴컴컴 . (China, Japan, & Korea) • 의의의 /의의 : 컴컴 컴컴 컴컴 컴컴 컴컴 (컴컴 컴컴 ) 컴컴 컴컴컴컴 컴컴컴컴컴 컴컴 . • 의의의 /의의 + 의의 : 컴컴 컴컴 컴컴컴 , 컴컴 컴컴컴 컴컴컴 컴컴컴 컴 컴컴 컴컴컴 컴컴 . 컴컴컴컴 + 컴컴컴컴컴 컴컴 컴 92 컴 . • 의의의 /의의 + 의의 : 컴컴컴 컴컴컴 컴컴컴 컴컴컴 컴컴 컴컴컴 컴컴컴컴컴 컴컴 컴컴 컴컴컴 컴컴컴 컴컴컴 컴컴 . (컴컴 )컴 컴컴컴 컴컴 컴컴컴 컴컴 컴컴컴 컴컴 컴컴 컴 컴컴 . 컴컴
  9. CJK 의의 의의의의 1: Candidate Window • 컴컴컴 • 컴컴컴

    • 컴컴컴컴 컴컴컴 , 컴컴 (dictionary) 컴컴컴컴 • 컴 컴컴컴 컴컴컴 컴컴컴컴 • 컴컴컴컴 컴컴 → 컴컴컴컴 컴컴컴 컴컴 컴컴컴 컴컴 컴컴컴컴 컴컴 컴컴 → woxihuan 컴컴 wxh 컴컴 컴컴컴 我喜欢 컴컴 컴 컴컴 컴컴컴컴 .
  10. CJK 의의 의의의의 • 컴컴컴 : 컴컴컴컴컴컴컴컴컴컴컴컴컴 2 : Multi

    - Stage Composition 컴컴컴컴컴컴컴컴컴 → 컴컴컴컴컴컴 컴컴컴컴 • 컴컴컴컴 : laapj trinhf raats vui → lập trình rất vui • 컴컴컴컴 컴컴컴컴컴 컴컴컴 , IME 컴 컴컴 컴컴 (컴컴컴 컴컴컴 컴컴 컴컴 )컴 컴컴 컴컴 컴컴컴 컴컴컴 컴컴컴 컴컴컴컴 컴 컴컴컴 컴컴컴 . 컴컴컴
  11. CJK 의의 의의의의 • 컴컴컴 컴컴컴컴 # IME 내부 상태

    최근_입력_상태 = [] 커서_위치 = 0 3: 의의의의의의의 IME 컴컴 컴컴 (컴컴컴 컴컴컴컴 의의 ): def 입력이_들어왔을_때( 키보드_입력): 변환_시도_결과 = 변환_시도( 최근_입력_상태 + 키보드_ 입력) if 변환_ 시도_결과 is not None : 이벤트_출력( 삭제, len ( 최근_ 입력_ 상태)) def 커서가_옮겨졌을_때( 새_커서_위치): 이벤트_출력( 조합, 변환_시도_결과) global 커서_위치 커서_위치 += len ( 변환_시도_결과) – len ( 최근_입력_상태) 최근_입력_상태. clear () Candidate_Window_ 가리기() # 안 할 수도 있음 커서_위치 = 새_커서_위치 최근_입력_상태. clear () return def 텍스트가_변경됐을_때(): if len ( 최근_입력_상태) == 0: global 커서_위치 Candidate_Window_ 표시() # 안 할 수도 있음 최근_입력_상태. clear () 이벤트_출력( 입력, 키보드_입력) 커서_위치 = 0 커서_위치 += len ( 키보드_입력) 최근_입력_상태. append ( 키보드_ 입력)
  12. 의의의의의의의 IME 의의의의 의의 의의의의 1. (Windows) Default Composition Window

    • 컴컴 컴컴컴컴컴 WM_CHAR 컴컴컴컴 • WM_IME_* 컴컴컴컴 컴컴컴컴 컴컴컴 2. Candidate Window 컴 컴컴컴 의의의의 의 컴컴 컴컴컴 컴 컴컴 → 컴컴컴 Windows 컴컴 컴컴컴 IME 컴컴컴 컴컴 컴컴컴 • iOS CMP 1.6 컴컴 컴컴 컴컴컴컴컴컴컴 컴컴컴컴컴컴 컴컴컴 컴컴컴컴컴컴 컴컴컴컴 컴컴컴컴 컴컴컴 • CMP for Web 1.8/1.9 컴컴 컴컴컴 <input> 컴컴 <textarea >컴 컴컴컴컴 컴컴컴컴 컴컴컴 . • 1.8컴컴 컴컴 컴컴컴 3. 의의 의의 의의 (의의의 컴컴컴컴 컴컴컴 컴컴컴 컴컴컴 . 1.9컴컴 컴컴 컴컴컴컴컴 . 의의 ) • 컴컴컴컴컴컴컴 컴컴 컴컴컴컴 컴컴컴컴 컴컴 컴컴컴컴 컴컴컴컴 컴컴 /컴컴 컴 컴컴 • iOS CMP 컴컴컴 Google Chrome 컴컴 iOS 17.0 컴 컴컴 컴컴컴 컴컴컴 컴컴 . • CMP for Web 1.8 컴컴 composition* 컴컴컴컴컴 컴컴컴 컴컴컴컴 컴컴컴컴 컴컴컴 . .
  13. 의의의 의의 : iOS CMP 의의 의의 의의의 • 컴컴

    : JetBrains/compose multiplatform#3101 • 컴컴 : JetBrains/compose multiplatform - core#718 의의의의 의의
  14. iOS CMP 의의 의의 의의의 • Compose 컴 컴컴 컴컴

    컴컴컴 의의의의 UI 컴컴컴컴컴 의의 : 의의의 . 컴컴컴 컴컴컴컴 의의 GUI 컴 컴컴컴컴 . • 의 의의의의 의의의의 의 의 의의 의의의 • 의 의의 의의의 의의의의 의 의 의의의 의의 • 의의 의 의의의 의 의 UI의 의의의의 IME 의의의의 TextFieldValue 의의의의 TextFieldValue 의 의의의의 UIKitTextInput Service TextField 의의 의의의의 IME 의의 의의 의의의 의의 의의의의 의의의의
  15. iOS CMP 의의 의의 의의의 1. IME 의의의의 의의의의 TextFieldValue

    2. TextFieldValue 의의의의 의의 : CMP 1.5 의의 TextFieldValue 의 의의의의 UIKitTextInput Service TextField 의의 의의의의의 IME 의의 의의 의의의 . 의의 의의의의 의의의의 .
  16. iOS CMP 의의 의의 의의의 의의의의 의의 : CMP 1.5

    의의 • IME컴 컴컴 TextFieldValue 컴 컴컴컴컴컴 TextFieldValue 컴컴 컴컴컴컴 컴컴 IME컴 컴컴컴컴 . • 컴컴 컴컴 컴컴 → 컴컴 컴컴 컴 컴컴 컴컴 컴컴 컴컴컴컴 • 컴컴 컴컴 & 컴컴 컴컴 컴컴 → IME컴 컴컴 컴컴컴 1. IME 의의의의 의의의의 TextFieldValue 컴컴컴컴 컴컴컴컴컴 TextFieldValue . . 의 의의의의 . UIKitTextInput Service TextField 2. TextFieldValue 의의 의의의의의 IME 의의 의의 의의의 의의 의의의의 의의의의 .
  17. iOS CMP 의의 의의 의의의 • IME 컴컴 컴컴 컴컴

    (컴컴컴 컴컴컴컴 의의의의 의의 : CMP 1.5 의의 ): # IME 내부 상태 최근_입력_상태 = [] 커서_위치 = 0 def 입력이_들어왔을_때( 키보드_입력): 변환_시도_결과 = 변환_시도( 최근_입력_상태 + 키보드_ 입력) if 변환_ 시도_결과 is not None : 이벤트_출력( 삭제, len ( 최근_ 입력_ 상태)) def 커서가_옮겨졌을_때( 새_커서_위치): 이벤트_출력( 조합, 변환_시도_결과) global 커서_위치 커서_위치 += len ( 변환_시도_결과) – len ( 최근_입력_상태) 최근_입력_상태. clear () Candidate_Window_ 가리기() # 안 할 수도 있음 커서_위치 = 새_커서_위치 최근_입력_상태. clear () return def 텍스트가_변경됐을_때(): if len ( 최근_입력_상태) == 0: global 커서_위치 Candidate_Window_ 표시() # 안 할 수도 있음 최근_입력_상태. clear () 이벤트_출력( 입력, 키보드_입력) 커서_위치 = 0 커서_위치 += len ( 키보드_입력) 최근_입력_상태. append ( 키보드_ 입력) 의의 의 의의의 의의의 IME 의의 의의의 의의의의 의의의의 !
  18. iOS CMP 의의 의의 의의의 • IME 컴컴 컴컴 컴컴

    (컴컴컴 # IME 내부 상태 최근_입력_상태 = [] 커서_위치 = 0 컴컴컴컴 의의의의 ): 의의의의 의의 : CMP 1.5 의의 의의 : ‘의의의 ’의 의의의의 ‘의 ’의의 의의의의 def 입력이_들어왔을_때( 키보드_입력): 변환_시도_결과 = 변환_시도( 최근_입력_상태 + 키보드_ 입력) if 변환_ 시도_결과 is not None : 이벤트_출력( 삭제, len ( 최근_ 입력_ 상태)) def 커서가_옮겨졌을_때( 새_커서_위치): 이벤트_출력( 조합, 변환_시도_결과) global 커서_위치 커서_위치 += len ( 변환_시도_결과) – len ( 최근_입력_상태) 최근_입력_상태. clear () Candidate_Window_ 가리기() # 안 할 수도 있음 커서_위치 = 새_커서_위치 최근_입력_상태. clear () return def 텍스트가_변경됐을_때(): if len ( 최근_입력_상태) == 0: global 커서_위치 Candidate_Window_ 표시() # 안 할 수도 있음 최근_입력_상태. clear () 이벤트_출력( 입력, 키보드_입력) 커서_위치 = 0 커서_위치 += len ( 키보드_입력) 최근_입력_상태. append ( 키보드_ 입력)
  19. iOS CMP 의의 의의 의의의 • IME 컴컴 컴컴 컴컴

    (컴컴컴 # IME 내부 상태 최근_입력_상태 = [] 커서_위치 = 0 컴컴컴컴 ): 의의의의 의의 : CMP 1.5 의의 의의 의의 : ‘의의의 ’의 의의의의 의의의의의 ‘의 ’ ‘의 ’ ‘의 ’ 의 의의 의의 def 입력이_들어왔을_때( 키보드_입력): 변환_시도_결과 = 변환_시도( 최근_입력_상태 + 키보드_ 입력) if 변환_ 시도_결과 is not None : 이벤트_출력( 삭제, len ( 최근_ 입력_ 상태)) def 커서가_옮겨졌을_때( 새_커서_위치): 이벤트_출력( 조합, 변환_시도_결과) global 커서_위치 커서_위치 += len ( 변환_시도_결과) – len ( 최근_입력_상태) 최근_입력_상태. clear () Candidate_Window_ 가리기() # 안 할 수도 있음 커서_위치 = 새_커서_위치 최근_입력_상태. clear () return def 텍스트가_변경됐을_때(): if len ( 최근_입력_상태) == 0: global 커서_위치 Candidate_Window_ 표시() # 안 할 수도 있음 최근_입력_상태. clear () 이벤트_출력( 입력, 키보드_입력) 커서_위치 = 0 커서_위치 += len ( 키보드_입력) 최근_입력_상태. append ( 키보드_ 입력)
  20. iOS CMP 의의 의의 의의의 의의의의 의의 : 의의 의의

    • UIKitTextInputService 컴 컴컴 컴컴 컴컴컴 TextFieldValue 컴 컴컴 컴 컴컴 컴컴 . • 컴컴 컴 컴컴 /컴컴컴 컴컴 컴컴컴컴 컴컴컴컴 컴컴컴컴 . • 컴컴 컴컴 컴컴컴 1. IME 의의의의 TextFieldValue 2. 의의 의의의의 의의의의 컴컴컴 컴컴컴 컴컴컴컴 컴컴 컴컴컴컴 의의 TextFieldValue TextField IME 의의 의의 의의의 , 컴컴 컴컴 컴컴 TextFieldValue 의의 의의의의 컴컴 / 컴컴컴 의 의의의의 . . IME컴컴 컴컴 0. 내부적으로 TextFieldValue를 하나 더 갖는다. UIKitTextInput Service 의의의의 컴 컴컴컴 컴 TextFieldValue 3. 양쪽의 값이 다를 때만 IME에게 보고한다.
  21. iOS CMP 의의 의의 의의의 의의의의 의의 : 의의 의의

    의의 • Candidate Window 컴 컴컴컴컴 컴컴컴컴 컴컴컴 컴컴컴 candidate window 컴 컴컴컴 컴컴 컴컴컴컴컴 컴컴컴 컴컴컴컴컴 컴컴 컴컴컴컴 컴컴컴 . • setMarkedText , unmarkText 컴컴컴컴 컴컴컴 API 컴 컴컴컴컴 컴컴컴 . • 컴컴컴 컴컴컴 컴컴컴 컴컴 , textWillChange 컴컴컴컴컴 컴컴컴 . , textDidChange 컴컴 컴컴 컴컴 컴컴 컴컴 API 컴컴컴 IME컴
  22. iOS CMP 의의 의의 의의의 의의의의 의의 : 의의 의의

    의의 • JetBrains/compose - multiplatform - core#3004 컴컴 컴컴 컴컴컴컴 • 컴컴 (CMP 1.11) 컴 TextInputConnection 컴컴 컴컴컴컴 , 컴컴컴 • 컴컴컴컴컴컴 컴컴컴컴 컴컴컴컴컴 컴컴컴컴 컴컴 컴컴컴
  23. 의의의의 의의 : 의의 의의의 • Android Studio 컴 컴컴컴

    컴컴컴컴컴 의의 의의 컴컴 컴컴컴 컴컴컴컴 . • 컴컴 컴컴컴 컴컴컴컴컴 컴 컴컴컴컴 컴컴컴 컴컴컴컴컴 컴컴 컴컴 컴컴컴 컴컴 . 컴컴컴 . (컴컴 컴컴컴 컴 컴 컴컴컴컴 ) UI 컴컴컴 컴컴컴컴 컴컴컴 컴컴컴컴 컴컴 컴컴 컴컴컴 컴컴 • strings.xml 컴컴컴 컴컴컴컴 • 컴컴컴 컴컴컴 컴컴컴컴 컴컴컴 컴컴컴 컴컴 컴컴컴 컴컴 컴컴컴 key 컴컴컴 . 컴컴컴컴컴컴 컴컴컴컴 컴컴컴컴 .
  24. 의의의의 의의 : 의의의 • LLM 컴 컴컴컴컴컴 컴컴 컴컴컴

    • Claude 컴 ChatGPT 컴컴 컴컴컴 • 컴컴 컴컴컴컴컴컴 컴컴컴 의의의 의의의의 컴 컴 컴컴 컴컴컴컴 컴컴컴 컴컴 컴컴컴 컴컴컴컴 컴컴컴컴 . 컴컴컴컴 컴컴 . . • Key 컴컴컴 < 의의 의의 /의의 > _< 의의 의 의의 의의 >_< 의의 >_< 의의 > 컴컴컴 컴컴 컴 컴컴컴컴 . 컴컴컴컴컴 • 컴컴컴 . 컴컴컴 컴컴 , UI 컴컴컴컴 컴 컴컴 컴컴컴컴 • 컴컴 UI컴컴 ‘컴컴 컴컴 ’, 컴컴 UI컴컴 ‘컴컴컴컴 컴컴 컴컴컴컴컴 . → 컴컴 컴컴컴 컴컴컴컴 . 컴컴컴 UI 컴컴컴컴 ’, 컴 컴컴 컴컴컴 컴컴컴컴 ‘컴컴 컴컴 ’ 컴컴컴 컴컴
  25. 의의 의의 의의의 • 컴컴컴 컴컴컴 컴컴 컴컴컴 의 의의의

    컴컴컴컴 의의의의 의의의 의 . • 컴컴컴 컴컴 : Color / 컴컴컴 컴컴 : Colour / 컴컴컴컴 컴컴 : Colour • 컴컴컴 컴컴 : Organize / 컴컴컴 컴컴 : Organise / 컴컴컴컴 컴컴 : Organize • 컴컴 컴컴 , 컴컴 컴컴 (컴컴컴 /컴컴 ), 컴컴컴 컴컴 컴컴 Android 컴컴컴 컴컴컴 • 컴컴컴 • 컴컴컴 컴컴 placeholder 컴 컴컴 컴 컴컴 . : 의 %d 의 / 컴컴 : %d book(s) • 의의 의의의의의 의의 의 의의 의의 의의의의 • 컴컴 : 1 book / 2 books 의의의 의 의의 .
  26. 의의의 의 • 컴컴컴 컴컴컴컴 • CJK 컴컴컴컴 컴컴컴컴 컴컴컴

    컴컴컴 컴컴컴 컴컴컴컴컴 컴컴컴컴 컴 等, 達, 達, 컴 컴컴 컴컴컴컴 컴컴컴 (컴们,, 等, 컴컴 컴컴컴컴 • 컴컴컴 컴컴 , 컴컴 컴컴컴 컴컴 컴컴컴 • 컴컴컴 컴컴컴컴 컴컴컴컴 1. 2. 컴컴컴 컴컴 컴 컴컴컴컴 컴컴컴컴 컴컴컴 컴컴 컴컴컴컴컴 컴컴컴 컴컴 UI 컴컴컴컴컴 컴컴컴컴 컴컴컴 , 컴컴컴컴컴컴 컴컴 컴컴 컴컴컴 컴컴컴 컴컴컴 컴컴컴컴 . 컴컴 컴컴 . : 컴컴 ).
  27. 의의의 의의 의의의 의의의 의의의 • 컴컴컴컴 • 컴 컴

    컴 : одна книга (odna kniga ) → 컴컴 • 컴 컴 /컴 /컴 컴 : две /три /четыре книги (dve /tri/chetyre knigi ) → 컴컴컴컴 • 컴 컴컴컴 : пять книг (pyat knig ) → 컴컴 컴컴컴 • 컴컴컴 • 컴 컴 컴 : ‫(كتاب واحد‬kitābun wāhidun ) → 컴컴 • 컴 컴 컴 : ‫(كتابان‬kitābāni ; 컴컴컴 컴컴 컴컴 ) → 컴컴 • 컴 컴 컴 : ‫(ثالثة كتب‬thalāthatu kutubin ; 컴컴컴 컴컴컴 컴 ) → 컴컴컴컴 컴컴컴 • 컴 컴 컴 컴 : ‫’(أحد عشر كتابا‬ahada ‘ashara kitāban ) → 컴컴컴컴 컴컴 * • 컴 컴 컴 : ‫(مائة كتاب‬mi’atu kitābin ) → 컴컴컴컴 컴컴컴 * *컴컴컴 컴컴컴 컴컴컴 컴컴컴컴 컴컴컴컴 컴컴컴 컴컴 컴컴 , 컴컴컴 컴컴컴 컴컴컴 , 컴 컴컴컴 컴컴컴컴 컴컴컴 컴컴 컴 컴컴 컴 컴컴컴 컴컴컴 컴컴 . 컴컴컴컴 컴컴컴 . CLDR 컴컴 컴컴컴 컴컴컴컴 컴컴컴 * 컴컴컴컴컴컴 .
  28. 의의의 의의 의의의의의의 의의의의 • 컴컴컴컴 컴컴컴 컴컴 컴컴컴 컴컴컴컴컴컴

    컴컴 컴컴 컴컴 (Language Plural Rules) 의의의 → 의의 → 의의의의 → 의의의 → 의의의 컴컴컴 , 컴컴컴컴 컴컴컴 컴컴 컴컴컴 의의의 의의의 CLDR 컴컴컴 . 컴컴컴컴
  29. 의의의 의의 의의의의의의 • 컴컴컴 컴컴 컴컴 • zero :

    컴컴컴 의의 0컴 컴 컴컴 • one : 컴컴컴 의의 1컴 컴 컴컴 • two : 컴컴컴 의의 2컴 컴 컴컴 • few : 컴컴컴 의의 컴컴 컴 컴컴 • many : 컴컴컴 의의 컴컴 컴 컴컴 • other : 컴 컴컴컴 컴컴 컴컴컴컴 • 의의 컴 컴컴컴 컴컴컴컴 컴컴컴 의의의의 의의의 의의의 컴컴 컴 컴컴 컴컴컴 컴컴 • 컴컴 컴컴컴 two 컴 10컴컴 컴컴 컴컴컴컴 2컴 컴컴 컴 컴컴컴 컴컴 컴컴 , 컴 컴컴 컴컴컴 two 컴 컴컴컴 2 컴컴컴 3 컴컴 컴컴컴 컴컴 컴컴 ! • 컴컴컴컴 CLDR 컴 컴컴컴 컴컴컴컴컴컴 . • 컴컴컴 컴컴컴컴컴컴 컴컴컴 컴컴 컴컴 . • 2026 컴 8컴 컴컴 컴 228 컴컴 컴컴컴 컴컴컴컴컴 . 의의의
  30. Android 의 의의 의의의의 의의 CLDR 의 의의의 • Android

    컴컴컴 Resources.getQuantityText 컴컴 컴컴컴 컴 컴컴 . • Android 23 컴컴컴 컴컴컴컴 컴컴 컴컴컴컴컴컴 () 컴컴 컴컴컴 ICU 컴 컴컴컴컴 • Android 24 컴 android.icu.text.PluralRules • Android 컴컴컴컴컴 컴컴 컴컴컴 컴컴컴컴 컴컴컴 컴컴컴 • Resources.getQuantityText 컴컴 컴컴컴 컴컴 컴컴컴컴컴컴 컴 컴컴컴 CLDR language plural rules () 컴 PluralRules 의의의의 컴 description 컴 컴컴 컴 컴컴컴컴컴 컴컴컴
  31. Resources.getQuantityText PluralRules.parseDescription > PluralRules.parseRuleChain > PluralRules.parseRule > PluralRules.parseDescription • XML

    컴컴컴컴 컴컴컴 컴컴컴 컴컴컴 () 의의의의 () () () () 컴컴컴컴 컴컴 컴 컴 컴컴 !
  32. 의의의 의의의의 의의 ? • XML 컴컴 컴 컴컴컴 컴컴컴

    • 컴 컴컴컴컴 컴 컴컴컴 • 컴컴컴 • 컴컴컴컴 컴컴컴컴 컴컴컴 컴컴 컴컴컴컴 컴컴 : 컴 컴컴컴 컴컴컴 컴컴 컴컴컴 (description) 컴 컴컴컴컴 컴컴컴 컴 컴컴컴 컴컴컴 , 컴 컴컴컴 컴컴컴컴 컴컴 . 컴컴컴 컴컴컴 컴 컴컴 . .
  33. 의의의 의의의의 의의 ? • zero : n = 0

    @integer 0 @decimal 0.0, 0.00, 0.000, 0.0000 • one : n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000 • two : n = 2 @integer 2 @decimal 2.0, 2.00, 2.000, 2.0000 • few : n % 100 = 3..10 @integer 3~10, 103~110, 1003, … • many : n % 100 = 11..99 @integer 11~26, 111, 1011, … • other : @integer 100~102, 200~202, 300~302, … • n의 의의 의 : n의 의 의의의 의의의의의 의의 * • @integer: 컴컴컴 컴컴컴컴 컴컴컴컴 컴컴 컴컴컴 컴컴 • @decimal: 컴컴컴 컴컴컴컴 컴컴컴컴 컴컴 컴컴컴 컴컴 *컴컴컴 n 컴컴 컴컴컴 컴컴컴컴 컴컴컴 , 컴컴컴 컴컴컴 컴컴 0 컴컴 컴컴컴컴컴 , n컴컴컴컴 컴컴컴 컴 컴컴 컴컴 .
  34. CMP 의 의의 의의의 plural strings • 컴컴 : JetBrains/compose

    - multiplatform#425 • 컴컴 : JetBrains/compose - multiplatform#4519 의의의 의의 의의 의의
  35. CMP 의 의의 의의의 plural strings • CLDR plural rule

    desciription 컴 컴컴컴컴 • 컴컴 컴 컴컴컴 컴컴컴컴 컴컴컴컴 의의의 의의 의의 의의 pure - Kotlin LL( 1) 컴컴컴 (컴 : true and 컴 → 컴 ) 컴컴컴 컴컴컴컴 컴컴컴컴컴 . 컴컴컴컴컴 .
  36. 의의 CMP 의의의 의의의의의의의의 의의 • moko - resources •

    컴 컴컴컴컴 컴컴컴컴 컴컴컴 컴컴컴컴 컴컴컴 컴컴 • Android 컴컴컴 Resources.getQuantityString () 컴컴 • Apple 컴컴컴컴컴컴컴 . stringsdict 컴컴 • Kotlin/JVM 컴컴컴 ICU4J 컴컴 컴컴 컴컴컴컴 컴컴 Java 컴컴컴컴컴컴 컴컴 • 컴컴컴컴 Intl.PluralRules 컴컴 • CMP 컴 컴컴컴컴 컴컴컴컴 컴 컴컴컴컴컴 , Windows 컴 Linux 컴 Kotlin/Native 컴컴 컴컴컴컴컴 ICU4C 컴 컴컴컴 컴컴컴컴컴컴 컴컴 → 컴컴컴컴 컴컴컴컴 . • Lyricist • 컴컴 컴 컴컴컴 컴 컴컴컴 컴컴컴컴 컴컴 컴컴컴컴 컴 • Libres (2024 컴 컴컴 컴컴 ) • 컴컴 , 컴컴컴컴 컴 5컴 컴컴컴 컴컴컴 • 컴컴컴 CLDR 컴컴 컴컴컴컴 컴컴컴 컴컴컴 컴컴 컴컴컴
  37. 의의의의 • 컴컴컴컴 • 컴컴컴 컴컴 컴컴 컴컴컴 컴컴컴 •

    컴컴 컴컴컴 • 컴컴컴컴컴 컴컴컴컴 컴컴컴컴 컴컴컴 컴컴컴컴 컴컴 컴컴컴컴 컴컴컴 . (EUC - KR, Shift - JIS 컴 ) 컴컴컴 0컴 0x10FFFF 컴컴 (컴 221 컴 )컴 의의의의의 컴컴컴컴 컴컴컴 컴컴 (glyph) 컴 컴컴컴 컴컴컴 컴 컴컴컴 컴컴컴 . 컴컴컴 컴컴컴컴 컴컴컴컴컴 컴컴컴컴 컴컴컴컴컴컴 컴컴컴컴 컴컴 . 컴컴 , • 컴컴 : XID_Start 컴 컴컴컴컴컴 컴컴컴컴 컴컴컴 (identifier) 컴 컴 컴컴컴 컴 컴 컴컴 컴컴컴 • XID_Continue 컴 컴컴컴컴 컴컴컴 컴컴컴컴 컴컴컴 컴 컴컴 컴컴컴 컴컴 • C++, Python, Rust 컴컴 컴컴컴 컴컴컴컴 컴컴 컴컴컴 컴컴컴컴 컴컴컴 컴컴컴컴 컴컴 • 컴컴컴컴컴 컴컴컴 컴컴 .
  38. 의의의의의 • 컴컴컴컴 의의의의 컴컴컴 의의 컴컴 : 컴컴컴컴 •

    UTF - 8 : 컴컴컴컴컴컴 컴컴컴 • Swift 5+ 컴 컴컴컴컴 컴컴컴 • 컴컴컴컴컴 컴컴컴 컴컴 컴 컴컴컴 • UTF - 16: 컴컴컴컴컴컴 컴컴컴 컴컴컴컴컴컴 1컴컴컴 컴컴 컴컴컴 컴컴컴 컴컴컴컴 컴컴 컴컴 컴 컴컴 컴컴컴 컴 컴컴 . 2컴컴컴 컴컴컴컴 컴컴컴 컴컴컴 • Java 컴 Kotlin, JavaScript, Objective - C 컴 컴컴컴컴 컴컴컴 • 컴컴컴컴컴 컴컴컴 컴컴 컴 컴컴컴 컴컴 컴컴 컴 컴 (surrogates) 컴 컴컴컴 • UTF - 32 : 컴컴컴컴컴컴 컴컴컴 4 컴컴컴 컴컴컴 • Rust 컴 char , Go 컴 rune , C++ 컴 char 32 _t • 컴컴컴컴컴 컴컴컴 컴컴 컴컴컴 컴컴컴컴 . • BOM: 컴 컴컴컴 , 컴컴 컴컴컴컴 컴컴컴컴 컴컴 컴컴컴 컴컴컴컴 컴컴컴 컴컴컴 컴 컴컴 . 컴컴컴
  39. 의의의의의 의의의의 의의 • “컴 ” = U+AC00 • UTF

    - 8 → EA B0 80 (3 컴컴컴 ) • UTF - 16 → AC00 (2 컴컴컴 ) • UTF - 32 → 0000 AC00 (4 컴컴컴 ) • “ ” = U+1F601 • UTF - 8 → F0 9F 98 81 • UTF - 16 → D83D DE01 • UTF - 32 → 0001F601 (4 컴컴컴 ) (4 컴컴컴 ) (4 컴컴컴 ) • 컴컴 , C#, Objective - C 컴컴컴 UTF - 16컴 컴컴 컴컴 : 컴컴컴 컴컴 컴컴컴 U+0000 - U+FFFF 컴컴컴 컴컴컴 컴컴컴컴 • 컴컴 UTF - 8 컴 컴컴컴 컴컴 : ASCII 컴컴 컴컴 , 컴컴 컴컴 컴컴 , 컴컴컴컴 컴컴컴컴 컴컴 컴컴
  40. 의의의의 의의의 • 컴컴 컴컴 컴컴컴컴컴컴 : NFC, NFD, NFKC,

    컴컴컴 컴컴 , 컴컴 , 컴컴컴컴 & NFKD 컴컴컴 컴컴컴컴 컴컴컴컴컴 • NF C /NFK C vs NF D/NFK D: • C (Composition): 컴컴컴 컴컴컴 컴컴컴 컴컴컴 • NFC ( U+1100 U+1161 U+11A8 ) = NFC ( “ 컴컴컴 ” ) > U+AC01 = “ 컴 ” • D (Decomposition): 컴컴컴 컴컴컴 컴컴컴 컴컴컴 • NFD( U+AC01 ) = NFD( “ 컴 ” ) > U+1100 U+1161 U+11A8 = “ 컴컴컴 ” • NFC/NFD vs NF K C/NF K D: • K (Compatibility): 컴컴컴 컴컴컴 컴컴 컴컴컴 컴컴컴 컴컴컴 • NFKC ( U+2460 ) = NFKC ( “ ①” ) > U+0031 = “1” 컴
  41. 의의의의 CLDR • Plurals 컴컴컴 컴컴컴 컴컴 컴컴컴컴 . •

    컴컴 : 의의 2026. 08. 16. / 의의 8/16/2026 • 컴컴 : 의의 컴컴 9:00 / 의의 9:00 AM • 컴컴 : 의의 $1.99 / 의의 1,99 € • 컴컴컴 컴컴 컴컴 (Collation ): • 컴컴컴컴 : Z 컴컴컴 Å, Ä컴 컴컴 . • 컴컴컴 : Ä=AE 컴컴 컴컴 A 컴컴컴 컴컴컴 컴 컴컴 . • MySQL, PostgreSQL 컴컴 RDBMS 컴 CLDR 컴 컴컴컴 collation 컴 컴컴컴컴 .
  42. CJK Ideographs • 의의 컴 컴컴컴컴컴컴 • 컴컴컴 컴컴컴컴 •

    컴컴컴컴 컴컴컴컴 컴컴컴컴컴컴 . 컴컴컴 컴컴컴 컴컴 : CJK Ideographs = CJK 컴컴컴컴 컴컴컴컴 컴컴컴컴컴 컴컴컴컴 컴컴 , 컴컴 컴컴 컴컴컴컴 • 의의의 의의의의 의의 의의의의의의 의의의 의의의의의의 의의의의 의의의 의의 . 의의의 컴컴컴컴 컴컴컴컴컴컴 . 컴컴컴컴 컴컴컴 의의 , 의의의 의의의의의 컴컴 의
  43. CJK Ideographs 의 의의의 • 컴컴컴컴컴 • 컴컴컴컴 : 의

    의 의 3 의의 의의의 컴 컴 (컴 ) 컴컴 컴컴 컴컴컴컴컴컴 컴 3 컴컴 컴컴컴컴컴 ? 컴 컴 컴컴 컴컴 . ? 1. 컴컴컴 컴 (U+2FA6): 컴컴컴컴컴 컴컴 컴컴 214 컴 컴 컴컴 2. 컴컴컴 컴 (U+91D1 ) 컴컴컴 컴컴컴컴 컴컴컴 컴컴 컴컴 컴컴 3. 의의의 金(U+F90A) : 의의의의 의의의 의의의 KS X 1001 의의 의의의의 의의 의의 의의의의 • KS X 1001 컴 컴컴 컴컴컴컴 컴컴컴컴 컴컴 컴컴컴컴컴 컴컴 컴컴 컴컴컴컴컴컴 컴컴컴컴 • 컴컴컴컴 ⾦컴 컴 컴 , 컴 컴 2컴컴컴 컴컴 컴 컴컴 컴컴컴 , 컴컴 컴컴컴컴 2컴 컴컴컴 . • 컴컴컴컴컴 컴컴컴 . KS X 1001 컴컴 컴컴컴컴 컴컴컴컴 컴컴 , ⾦컴 컴컴 컴컴컴컴컴컴 컴컴 컴 컴 .
  44. CJK Ideographs 의 의의의 • 컴컴컴컴컴 1. 컴컴컴 : 의의의

    컴컴 컴 (컴 ) 컴컴 컴컴 glyph 컴 컴컴컴컴컴컴 컴 (U+2FBC): 컴컴컴컴컴 의의 의의 의 컴 컴 컴컴 컴컴 . 컴컴 컴컴 214 컴 컴 컴컴 2. 컴컴컴 컴 (U+9AD8 ) 컴컴컴 컴컴컴컴 컴컴컴 컴컴 컴컴 컴컴 3. 의의의 의 (U+9AD9) : 의의의의 의의의 의의의 JIS X 0213 의의 의의의의 의의 의의 의 • JIS X 0213 컴 컴컴컴컴 • 컴컴컴컴컴 컴컴컴컴 의 컴컴컴컴컴 JIS X 0213 컴컴 컴컴컴컴 컴컴컴컴 의의의의 의 컴컴 컴컴 컴컴 컴컴컴컴컴컴 컴컴 , 컴컴컴 컴컴컴컴컴컴컴 컴컴컴컴 컴컴컴컴 . .
  45. CJK Ideographs 의 의의의 JIS 컴컴컴컴 The Unicode Consortium, “East

    Asia,” in The Unicode Consortium, 2025, ch. 18, p. 컴컴컴컴 : 의의 6 의 ? 컴컴 컴컴컴컴컴 The Unicode Standard, Version 17.0 941. 컴컴컴 컴 컴 6컴 , Mountain View, CA, USA:
  46. CJK Ideographs 의 의의의 • 컴컴 컴컴 컴컴컴컴 컴컴컴 컴컴컴

    : 의의의 컴컴컴 의의의 의의 의의의의의 , 컴컴컴컴컴 컴컴컴 컴컴컴컴컴 컴컴컴컴 컴컴컴 컴컴컴 : • 컴컴컴 컴컴컴 컴컴 • 컴컴컴컴 컴컴컴 컴컴컴 컴컴컴 컴컴컴컴컴컴 컴컴컴 . • 컴 컴 의 컴 컴컴 컴 의 컴 컴컴컴컴 컴컴컴컴컴 • 컴컴컴 컴컴컴 컴컴컴 컴 의 컴 컴 컴컴컴 의 컴 컴컴컴 컴컴컴컴 컴컴 컴컴컴컴컴 • 의의 의의의 의의의의의 ? 컴컴컴 컴컴컴 컴컴컴컴 컴컴컴컴 컴컴컴컴 컴컴 컴컴컴컴
  47. Noto Sans CJK 의 SC, TC, HK, JP, KR 의의의의의

    의의 Simplified Chinese (간체자, 중국/싱가포르/말레이시아 등) 의 의 의 의 의의의의 의 의의의의의 의 Traditional Chinese (정체자/번체자, 대만) 의 의 의 의 의 의 의 의 의 의 의 의의의 의 Hong Kong (정체자/번체자, 홍콩) 의 의 의 의 의의의의의의의 의 의 의 의 Japan (신자체, 일본) 의 의 의 의 의의 의 의의의의 의 의 의 의 의 의 의 의의 의의 Korea (한국) 의 의 의 의 의의 Based on: https:// www.reddit.com /r/ChineseLanguage 의 의 /comments/14wxm04/ simplified_vs_traditional_vs_hong_kong_glyphs /
  48. Noto Sans CJK 의 SC, TC, HK, JP, KR •

    컴컴컴컴컴컴 컴컴컴 • 컴컴 컴컴 컴컴컴 , 컴컴컴 컴컴 컴컴컴 컴컴 컴컴컴 컴컴컴컴 컴컴컴 컴컴컴 의의의의의 . . • 의의 의의의의 의의의의 의의 의의의 의의의 • 컴컴 컴컴컴컴컴 컴컴컴 컴컴 컴컴컴 컴컴 컴컴컴 컴컴컴 컴컴컴 컴컴컴컴 컴컴컴 컴컴컴컴 컴 컴컴컴 컴컴컴 컴컴컴컴 컴컴컴 의의 UI의 의의의 의의의의 의의 의 의의 의의 . . 컴
  49. CJK Ideographs 의 의의의 컴컴컴컴 The Unicode Consortium, The Unicode

    Consortium, 컴컴 컴컴컴 “East Asia, ” in The Unicode Standard, Version 2025 , ch. 18, p. 940 . 3 컴컴 컴컴 컴컴 17.0 , Mountain View, CA, USA:
  50. CJK Ideographs 의 의의의 • 컴컴컴컴 컴컴컴 컴컴컴 의의의 의의의

    의의의의 컴컴컴 의의의 컴컴 컴 컴컴컴컴 컴컴컴 . • 의 컴컴 컴 (컴컴컴 ), 컴 컴 (컴컴컴 )컴 컴컴 , 컴컴 컴컴 컴컴 컴컴 컴컴컴 컴컴컴 컴컴컴컴컴 컴컴컴 컴컴컴 컴컴컴컴 컴컴 컴컴컴컴컴 • 컴 컴컴 컴컴컴컴 • 의 컴 컴컴 의 컴컴 , 컴컴컴 컴컴 컴컴컴 , 컴컴컴컴 컴컴컴 컴컴 컴컴컴 컴컴컴컴 컴컴 컴컴컴컴컴 , 컴컴 컴컴컴컴컴컴 컴컴컴컴 ,
  51. 의의의 의의의 (Glyph) 의 의의 의의 의의의 • 컴컴 (character):

    컴컴컴컴 컴컴컴컴 • 컴컴컴 (glyph): 컴컴 컴컴컴 컴컴컴 컴컴컴 컴컴 • 컴컴컴 컴컴 컴 컴컴컴 컴컴 컴컴컴 컴컴컴컴 컴컴 컴 컴컴 . • 컴 : 컴컴 컴컴컴 • 컴컴 컴컴컴 컴컴컴 컴컴컴컴 , 컴컴컴 컴컴컴컴 컴컴컴컴 컴컴 , 컴컴 , 컴 컴컴 컴컴컴컴 컴컴컴 컴컴 컴컴 . • 컴 : f + i → fi 컴컴 ligature • 컴컴컴 컴컴컴컴 컴컴컴컴컴 컴컴 컴컴컴컴 https://en.wikipedia.org/wiki/Arabic_alphabet https:// mn.gov /mnit/media/blog/?id= 38 - 497550 컴컴컴컴컴 컴컴 컴컴 컴 컴컴 . 컴컴
  52. 의의의 의의의의 • 컴컴 컴컴컴 의의 의의의 컴컴 , 컴컴컴

    컴컴컴 • 컴컴 컴컴 컴 컴컴 컴 컴컴컴 • R2L( 컴컴 컴컴 , 컴컴컴 컴컴컴컴 bidi 컴컴컴컴컴 의의의 컴컴 컴컴 컴컴컴 컴컴 fallback 컴컴 , …), L2R 컴컴컴 컴컴 컴컴 컴컴 컴컴 컴컴 • 컴컴컴 shaping • Line breaking, word breaking, glyph positioning • 컴컴컴컴 , 컴컴컴컴컴컴컴 ,… • 컴컴 컴컴컴컴컴컴 컴컴 , 컴컴컴 https:// ux.stackexchange.com /questions/36774/designing 컴컴컴 컴컴컴 컴컴 컴컴컴 - bidi - text - editing 컴컴컴 컴 컴컴 .
  53. 의의의 OpenType • 컴컴컴컴 컴컴컴컴 컴컴컴컴컴컴 컴컴컴 컴컴컴 컴컴컴 컴컴

    컴컴컴 컴컴컴컴 . 컴컴컴 • OpenTyp e컴 컴컴 컴컴컴컴컴 컴컴 컴컴컴컴컴 컴컴컴 컴컴컴 컴컴컴컴 컴컴컴컴 . • OpenType 컴 컴컴컴 https://learn.microsoft.com/en 컴컴 컴컴 컴컴컴컴컴컴 - us/typography/opentype/spec/chapter2 .
  54. OpenType 의의의의 의의의의 • cmap : 컴컴컴컴 glyph ID 컴

    컴컴컴컴컴 • GSUB : 컴컴컴 컴컴컴컴컴컴 컴컴 glyph 컴컴 컴컴컴컴컴 • GPOS : glyph 컴 컴컴컴 컴컴컴 • GDEF : base, ligature, mark • 컴컴컴 컴컴컴 컴컴컴 컴컴컴컴 의의 . ligature 컴 컴컴컴 . anchor 컴 컴컴컴컴 . 컴컴 glyph 컴 컴컴컴 컴컴컴컴 . HarfBuz z 컴컴 text shaping 컴컴컴컴컴컴컴 컴컴 컴컴컴 컴 컴컴 .
  55. HarfBuzz • 컴컴컴 컴컴컴컴 컴컴컴컴 컴컴컴 컴컴컴컴 컴컴컴컴 컴컴컴컴컴 •

    Android, Google Chrome, Flutter (Impeller), OpenJDK, Adobe Illustrator, Adobe Photoshop, Unreal Engine, … 컴컴 컴컴컴컴 컴컴 • Compose Multiplatform 컴 컴컴 컴컴컴컴컴 컴컴컴 컴 컴컴컴컴 Skia 컴 컴컴컴 컴컴컴컴 컴컴 HarfBuzz 컴 컴컴 https://github.com/ harfbuzz /harfbuzz
  56. HarfBuzz 의 의의의 OpenType 의의 의의의의 • cmap 컴 컴컴

    컴컴 10컴컴 컴컴컴컴 컴컴컴컴컴컴 let let cmap = font . cmap () ? ; mut unicode = HashMap :: new(); for n in 0..= 0xFF { let Some ( cp ) = char :: from_u 32 ( n) else { continue }; let Some ( gid ) = cmap . map_codepoint else { continue }; let id = gid . to_u 32 () as usize ; if id < 10 { unicode . insert ( id , cp ); } } 컴컴컴컴 glyph 컴 컴컴컴컴 gid 0 U+FFFF gid 1 U+0000 gid 2 U+000D gid 3 U+0020 gid 4 U+0021 gid 5 U+0022 gid 6 U+0023 gid 7 U+ 0024 gid 8 U+0025 gid 9 U+0026 ( cp )
  57. HarfBuzz 의 의의의 OpenType 의의 의의의의 • GSUB 컴 컴컴

    Noto Serif 컴 fi ligature 컴컴컴 Some ( index ) = subtable . coverage () ? . get ( GlyphId :: new( f )) else { continue }; let set = subtable . ligature_sets () . get ( index as usize ) ? ; for ligature in set . ligatures () . iter () { let ligature = ligature ?; let tail = ligature . component_glyph_ids () . iter () . map( | g | g . get () . to_u32 ()); if tail . eq ([ i ]) { println ! ( " f+i > gid {}" , ligature . ligature_glyph () . to_u32 ()); } } 컴컴컴컴 let gid 73 + 76 (GSUB off) gid 2148 (GSUB on)
  58. HarfBuzz 의 의의의 OpenType 의의 의의의의 • GPOS 컴 컴컴

    Noto Nastaliq 컴 anchor 컴 컴컴컴컴 https://medium.com/@megcanale/language - is - culture - 74bc5bad5e7d
  59. HarfBuzz 의 의의의 OpenType 의의 의의의의 • GPOS 컴 컴컴

    Noto Nastaliq 컴 anchor 컴 컴컴컴컴 let Some(index) = subtable.coverage()? .get(GlyphId::new(gid)) else { continue }; let record = subtable.entry_exit_record() .get(index as usize) .unwrap()?; let data = subtable.offset_data(); let entry = anchor_tuple(record.entry_anchor(data))?; let exit = anchor_tuple(record.exit_anchor(data))?; println!("gid {gid}: {entry:?}, {exit:?}"); GPOS on & anchor 의의 GPOS off
  60. iOS CMP 의의 line break 의 의의의 의의의의 • AndroidX

    Compos e컴 컴컴 : android.text.StaticLayout • android.text.StaticLayout 컴컴컴 컴컴컴컴 컴컴 • iOS 컴 Skia 컴컴컴 컴 minikin 컴컴컴 SkParagraph 컴 컴컴 컴컴컴 컴컴컴컴컴 의의 컴컴 컴컴 컴컴 컴컴컴컴컴컴 컴컴 컴컴 • HarfBuzz 컴 컴컴컴 컴컴 /컴컴컴 컴컴컴컴 minikin 컴컴 SkParagraph 컴 컴컴 컴컴컴 컴컴컴 컴컴 • SkParagraph 컴 컴컴컴 컴컴컴 컴컴 컴컴컴컴컴 컴 컴컴컴 컴컴컴 컴컴컴컴 컴컴컴 컴컴 컴컴컴컴컴 컴컴 • minikin 컴 컴 컴컴컴 컴컴 컴컴 /컴컴컴 컴컴 컴컴 컴컴 penalty 컴 컴컴컴컴컴 컴컴컴컴컴 컴컴 컴컴 → iOS CMP 컴컴 컴컴컴컴 컴컴컴 컴컴컴컴 컴컴 ! • 컴컴 컴컴컴컴컴컴 컴컴 컴컴컴컴 컴컴컴 line break 컴 컴컴 컴 컴컴 . 컴컴컴
  61. iOS CMP 의의 line break 의 의의의 의의의의의 • Android

    컴컴컴컴 컴컴컴 컴컴컴컴컴 greedy/ 컴컴컴 Skia /Skiko 컴 컴컴컴 컴컴 enum 컴컴 • enum class LineBreakStrategy { GREEDY, HIGH_QUALITY, BALANCED } 컴컴컴컴컴 • androidx.compose.ui.text.platform.ParagraphBuilder.textSt yleToParagraphStyle() 컴컴 CMP 컴 LineBreak 컴 컴컴 LineBreakStrategy 컴 컴컴컴컴 ParagraphStyle 컴 컴 LineBreakStrategy 컴컴컴 컴컴 의의 컴컴컴 컴 컴컴컴
  62. iOS CMP 의의 line break 의 의의의 • minikin 컴

    컴컴컴 penalty 컴컴컴 의의의의의 의의 컴컴 • penalty = 컴 컴컴컴 컴컴컴 컴컴컴 컴컴 컴컴컴 컴컴컴 + 컴컴컴 컴 컴 × 컴컴 컴컴 × 컴 컴 컴컴 컴 • 컴 컴컴 (cluster) 컴 컴 컴컴 컴 컴컴컴 컴컴컴컴 컴 , 컴컴 컴컴 컴컴 컴컴컴 컴컴컴 컴컴컴컴 penalty 컴 컴컴컴컴컴컴 컴컴 컴컴컴컴컴컴컴 컴컴 컴 컴 컴컴 컴
  63. iOS CMP 의의 line break 의 의의의 • 컴컴 컴컴

    (Noto Sans CJK KR Android 의의의의의 ), 컴컴 컴컴 (333 dp ) 컴 컴컴컴컴 iOS 의의 의의 컴컴컴 iOS 의의
  64. KMP 의 Locale 의의의 의 의의 • 컴컴 컴컴컴 컴컴

    : 컴컴 컴컴 컴컴 컴컴컴 컴컴컴컴컴 . • 컴컴컴컴 $1.99, 컴컴컴컴 1,99 € 컴 컴컴컴컴 컴컴 . • Kotlin/JVM: import java.text.NumberFormat.getCurrencyInstance import println println • Swift: • 의의 KMP 의 ? java.util.Locale ( getCurrencyInstance ( getCurrencyInstance ( Locale. ( Locale. US).format( 1.99 )) // $1.99 GERMANY).format( 1.99 )) // 1,99 € import Foundation let formatter = NumberFormatter () formatter.numberStyle = .currency formatter.locale = Locale(identifier: " en_US " ) print( formatter.string (from: NSNumber (value: 1. 99 ))!) formatter.locale = Locale(identifier: " de_DE " ) print( formatter.string (from: NSNumber (value: 1. 99 ))!) // $1.99 // 1,99 €
  65. KMP 의 Locale 의의의 • 컴컴컴 컴컴 컴컴컴 컴컴 컴컴컴

    의 의의 컴컴컴 • 의의 : KMP 의 String.format 의 의의 의의의 • 컴컴컴 • 컴컴컴컴컴 컴컴 컴컴컴 컴컴컴컴 컴컴 컴컴 ! 의의 컴컴 (컴컴 , 컴컴 , 컴컴 , 컴컴 , …) expect /actual 컴컴컴컴 컴컴컴컴 , 컴컴 컴컴컴 컴컴컴컴컴 • 컴컴 컴컴컴컴 UI컴 컴컴컴컴 ? 컴컴컴 컴컴컴컴 컴컴컴컴 ? • API 컴컴컴 (컴 : IAP) 컴컴 /컴컴 컴컴컴 컴컴컴 ? • UI컴컴 컴컴컴 컴컴컴컴컴 ? • UI컴 컴컴 컴컴컴 컴컴컴컴컴 컴컴컴 컴컴컴 컴컴컴컴컴컴 컴컴 컴컴컴 • 컴컴컴 컴컴컴 컴컴컴컴컴컴 컴컴컴 컴컴 컴컴 컴컴컴 컴컴컴컴컴 ? . ? 컴 컴컴컴컴 .
  66. KMP 의 Locale 의의의 의 의의 • 컴컴 KMP 컴컴

    컴 컴컴컴컴 Locale • 컴컴 컴컴컴컴컴컴 컴컴 , kotlinx 컴컴컴 컴컴컴컴 컴컴컴 - locale 컴컴컴컴컴컴 컴컴컴컴 컴컴컴 컴 컴컴 컴컴컴 컴컴컴 컴 컴컴 . • CMP 컴 android.compose.ui.text.intl.Locale 컴컴컴 컴컴컴컴 . 컴 컴컴컴 • 컴컴컴컴 컴컴컴컴컴컴컴 컴컴컴컴 컴컴 컴컴 . • 컴컴컴 컴 : 컴컴컴 컴컴 컴컴컴컴 컴컴컴컴컴 컴컴 컴컴컴 • Java 컴 java.util.Locale • Swift Foundation 컴 Locale • 컴컴 Intl.Locale • Windows 컴 Linux 컴컴 , 컴컴컴 / Objective - C 컴 NSLocale 컴컴컴컴 컴컴컴 • 컴컴 : Flutter 컴 Dart 컴컴 컴컴 intl 컴컴컴컴 Kotlin/Native 컴컴컴 컴컴 , 컴컴 /컴컴 .
  67. expect /actual expect fun Int. Android & JVM Apple Platforms

    println 의 의의 Locale 의의의의 toCommaSeparated : 의의 (): String // Android & JVM actual fun Int. toCommaSeparated String. format ( "%,d" , this ) () = // Apple Platforms import platform.Foundation.* actual fun Int. toCommaSeparated (): String { val formatter = NSNumberFormatter (). apply { numberStyle = NSNumberFormatterDecimalStyle locale = NSLocale.currentLocale } return formatter.stringFromNumber ( NSNumber ( this )) ?: toString () } ( 1234 .toCommaSeparated()) // 1,234 or 1.234
  68. expect /actual 의 의의 Locale 의의의의 import kotlin.time.* enum class

    FormatStyle { Full , Long , Medium , Short } expect fun Instant. localized (date: FormatStyle , time: println ( Clock.System.now (). localized (...)) : 의의 FormatStyle // 8/15/26, 10:54 PM ): String
  69. expect /actual 의 의의 Locale 의의의의 : 의의 Android &

    JVM import java.time.format.FormatStyle as JavaFormatStyle private fun FormatStyle. toJava (): JavaFormatStyle = when ( this ) { FormatStyle. Full > JavaFormatStyle. FULL FormatStyle. Long > JavaFormatStyle. LONG FormatStyle. Medium > JavaFormatStyle. MEDIUM FormatStyle. Short > JavaFormatStyle. SHORT } actual fun Instant. localized (date: FormatStyle , time: FormatStyle ): String { val outputFormat = DateTimeFormatterBuilder () . appendLocalized ( date. toJava (), time. toJava ()) . toFormatter ( Locale.getDefault ()) . withZone ( TimeZone.getDefault (). toZoneId ()) return outputFormat.format ( toJavaInstant ()) } println ( Clock.System.now (). localized (...)) // 8/15/26, 10:54 PM
  70. expect /actual 의 의의 Locale 의의의의 : 의의 Android &

    JVM import java.time.format.FormatStyle as JavaFormatStyle private fun FormatStyle. toJava (): JavaFormatStyle = when ( this ) { FormatStyle. Full > JavaFormatStyle. FULL FormatStyle. Long > JavaFormatStyle. LONG FormatStyle. Medium > JavaFormatStyle. MEDIUM FormatStyle. Short > JavaFormatStyle. SHORT } actual fun Instant. localized (date: FormatStyle , time: FormatStyle ): String { val outputFormat = DateTimeFormatterBuilder () . appendLocalized ( date. toJava (), time. toJava ()) . toFormatter ( Locale.getDefault ()) . withZone ( TimeZone.getDefault (). toZoneId ()) return outputFormat.format ( toJavaInstant ()) } println ( Clock.System.now (). localized (...)) // 8/15/26, 10:54 PM
  71. Android 의의 Locale.getDefault • Locale.getDefault • Android 컴 컴컴컴컴 ()

    컴 컴컴컴 컴컴컴컴 () 의 의의 의의의 컴컴컴 컴컴 컴컴컴 컴컴컴 컴컴컴 • 컴컴컴컴 configuration change 컴 컴컴컴컴 • android.content.Context 컴 컴컴컴컴 컴 컴 컴컴컴컴 컴컴컴컴 컴컴 컴 컴컴 . 컴컴 컴컴컴컴 ! 컴 컴컴 . → 컴컴컴컴컴 컴컴컴컴컴컴 ! 컴컴 getDefault () 컴 컴컴 의의
  72. expect /actual 의 의의 Locale 의의의의 Android import import import

    import import androidx.compose.runtime.Composable androidx.compose.ui.platform.LocalContext android.content.Context androidx.core.os.ConfigurationCompat java.util.Locale actual fun getCurrentLocale (context: Context): Locale { return ConfigurationCompat.getLocales ( Context.resources.configuration )[ 0] ?: Locale.getDefault () } // or @Composable actual fun getCurrentLocale (): Locale { return getCurrentLocale ( LocalContext.current ) } : 의의
  73. expect /actual 의 의의 Locale 의의의의 : 의의 Apple Platforms

    import platform.Foundation.* actual fun Instant. localized (date: FormatStyle , time: FormatStyle ): String { val formatter = NSDateFormatter (). apply { locale = NSLocale.currentLocale dateStyle = date. toFoundation () timeStyle = time. toFoundation () } return formatter.stringFromDate ( toNSDate ()) } private fun FormatStyle. toFoundation (): NSDateFormatterStyle = when ( this ) { FormatStyle.Full > NSDateFormatterFullStyle FormatStyle.Long > NSDateFormatterLongStyle FormatStyle.Medium > NSDateFormatterMediumStyle FormatStyle.Short > NSDateFormatterShortStyle } println ( Clock.System.now (). localized (...)) // 8/15/26, 10:54 PM
  74. expect /actual val now = 의 의의 Locale 의의의의 Clock.System.now

    : 의의 () // Saturday, August 15, 2026 at 11:24:56 PM Korean Standard Time // 2026 년 8월 15 일 토요일 오후 11 시 24 분 56 초 대한민국 표준시 println ( now. localized ( FormatStyle. Full , FormatStyle. Full )) // August 15, 2026 at 11:24:56 PM KST // 2026 년 8월 15 일 오후 11 시 24 분 56 초 KST println ( now. localized ( FormatStyle. Long , FormatStyle. Long )) // Aug 15, 2026, 11:24:56 PM // 2026. 8. 15. 오후 11:24:56 println ( now. localized ( FormatStyle. Medium , FormatStyle. Medium )) // 8/15/26, 11:24 PM // 26. 8. 15. 오후 11:24 println ( now. localized ( FormatStyle. Short , FormatStyle. Short ))
  75. kotlinx - locale 의 의의의 • 컴컴컴 컴컴 컴컴컴컴 .

    컴컴 컴컴컴 컴컴컴 컴컴 , 컴컴 /컴컴 컴컴컴 컴컴 컴 컴 컴컴 . • en- KR 컴 컴컴 • 컴컴 AOSP 컴컴 ko - KP, ko - CN 컴 컴컴 . • 컴 컴컴컴 컴컴컴 • SNS 컴컴컴 • 컴 컴컴컴 • 컴컴컴 컴컴 컴컴 컴 컴컴 , 컴컴컴 컴컴컴 컴컴 컴컴컴컴 컴컴 fallback 컴컴컴 → 컴컴컴 • Android 컴 컴컴컴 • 컴컴컴 컴컴 컴컴컴 컴컴컴컴 • 컴컴 : kotlinx / 컴컴컴 컴컴컴 컴컴컴 컴컴컴 컴컴컴 /컴 컴컴컴 컴컴 컴컴컴 . 컴컴 . 컴컴 컴컴 컴컴컴컴 컴컴 컴컴컴컴 컴컴컴 컴컴컴컴 컴컴컴컴 . 컴컴 컴 컴컴 . android.content.Context - locale 컴컴컴 컴컴 , 컴컴 컴컴컴 → 컴컴컴 컴 컴컴컴 컴컴컴 컴컴컴컴컴컴 컴 컴컴컴컴 컴컴 . 컴컴컴컴 . 컴 컴컴 .
  76. 의의의의 의의의 • 컴컴컴컴 컴컴컴컴 의의의 의의의 의의의 의의의의의 interrupt

    - driven IO 컴 DMA 컴 컴컴 컴 컴컴컴 컴컴컴컴 • 컴 컴컴 컴컴컴 컴컴컴 컴컴컴컴 컴컴컴 컴 컴컴컴 컴 컴컴컴 컴컴컴 컴컴컴컴컴 컴컴 컴컴컴 , IME컴 컴컴컴컴 • 컴컴컴 컴 IME컴 컴 컴컴 컴컴 컴컴 . 컴컴 컴컴컴 컴컴 컴컴컴 컴컴컴 • 의의 , 의의 , 의의 의의 CJK 의의의의 • IME 의 의의 의의의 의의의 의의의의 • iOS 컴컴컴 IME컴 컴컴컴컴 • 컴컴 컴컴 컴컴컴컴 컴컴컴컴 • 컴컴 컴컴 컴컴컴컴 컴컴컴 . IME 의 의 의의 의의 의의 . 의의의 의의의의 의의의 의 의의 . CMP 컴 컴컴컴 컴컴 컴컴컴 컴컴컴컴컴 컴컴컴 컴컴컴컴 컴컴컴 컴컴컴컴 컴컴컴 컴 컴컴컴 컴컴컴컴 컴컴컴 . . 컴컴컴 컴 컴 컴컴컴 . .
  77. 의의 의의 i18n의 의 의의의 의의의의 의 의의의의 의의 •

    컴컴컴 컴 컴컴 . 컴컴컴 컴컴컴컴 컴컴컴컴컴 • 컴컴컴 컴컴컴컴 컴컴컴 컴컴 UI 컴컴컴컴 • 컴컴컴 컴컴컴 컴컴컴컴 컴컴 , 컴컴 + 컴컴 (+ 컴컴 + 컴컴 컴컴 컴 )컴 컴컴 컴컴 컴컴컴 컴컴컴 . 컴컴컴 • 컴컴 컴컴 컴컴컴 컴 컴컴컴 컴컴컴 • 컴컴 컴컴컴 컴컴컴컴 컴컴 컴컴컴컴 컴컴컴 컴컴컴컴 컴컴컴컴 컴컴컴컴 . CLDR 컴 컴컴컴컴 컴컴컴컴 컴컴컴컴 . 컴컴컴컴 컴컴컴 컴컴컴 컴컴컴 . 컴컴 . 컴컴컴
  78. 의의의의의 의의의의 • 컴 컴컴 컴컴 컴컴 컴컴컴 컴컴컴 컴컴컴컴컴

    컴컴 컴컴컴컴 컴컴컴컴 컴컴컴 , 컴 컴컴컴 • 컴컴컴컴컴컴 컴컴컴 컴컴컴 , 컴컴컴컴 컴컴컴컴 , 컴컴컴컴컴컴 컴컴컴컴 컴컴컴 컴컴컴컴 컴컴컴 컴컴컴 컴컴 컴컴컴 컴컴컴컴 • 컴 컴컴컴컴컴컴 컴컴컴컴 . 컴컴컴 컴컴컴컴 컴컴 , 컴컴컴 컴 컴컴컴 컴컴컴컴컴컴컴 컴컴컴 컴컴 컴컴 컴 컴컴컴컴 . 컴컴 컴 컴컴컴 컴컴컴 컴컴컴컴 • 컴컴컴컴 CLDR 컴 컴 컴컴컴 컴컴 , 컴컴 , 컴컴 , 컴컴컴 컴컴 컴컴 컴컴 컴컴컴 컴컴 컴컴 컴컴컴 컴컴컴 . • CJK 컴컴컴 컴컴 , 컴컴컴컴 컴컴컴 컴컴컴컴 컴컴컴컴컴컴 컴컴컴컴컴 컴컴컴 , 컴컴컴컴 컴컴컴 컴컴컴 컴컴 컴 컴컴컴 컴컴 컴컴컴 컴컴컴 컴컴컴컴 컴컴 컴컴컴컴 .
  79. 의의의의 의의의 의의의의의의 • 컴컴컴 컴컴컴 컴컴컴컴 • 컴컴컴 컴컴컴

    컴컴 컴컴컴컴컴 • 컴컴컴컴 컴컴컴 컴컴컴컴 컴컴 컴컴컴 컴 컴컴 / 컴컴컴컴 컴컴컴컴 컴컴컴컴 컴컴 컴컴컴 컴컴컴 컴컴컴 컴컴컴컴 . 컴컴 컴컴 컴 컴컴컴 • HarfBuzz 컴 Android 컴 iOS CMP 컴컴 컴컴컴컴 • HarfBuzz 컴 컴컴 OpenType 컴컴 컴컴 컴컴컴 컴컴컴 컴컴컴 컴 컴컴 . 컴컴컴 컴컴컴 컴컴 OpenType 컴컴 . 컴컴컴컴 컴컴컴컴컴컴컴 컴컴 , 컴컴 컴컴 , 컴컴컴 . 컴컴 컴컴 • Skia 컴 SkParagraph 컴 greedy 컴컴컴컴컴 컴 컴컴컴 컴컴컴 iOS 컴컴 컴컴컴컴 컴컴컴 컴컴컴 , AndroidX Compose 컴컴 컴컴컴 컴컴컴 . • Skiko , Skia 컴 컴컴컴 컴컴컴컴컴 . 컴컴컴컴 컴컴컴 컴컴컴 컴컴컴 컴컴 line break 컴
  80. KMP 의의 의의의 i18n 의 의 의의의 • KMP 컴컴

    컴컴 컴컴컴컴 컴컴 컴컴컴 expect /actual 컴컴컴 컴컴컴컴 • 컴컴컴 컴컴 컴컴컴컴 컴컴컴컴컴 컴컴컴컴 의의의의의 컴 컴컴 i18n 컴컴컴컴 컴컴 . 컴컴 컴컴컴 , 컴 컴컴컴컴 컴컴컴컴 CLDR 컴컴컴 컴컴컴 컴컴 컴컴컴컴 • 컴컴 , 컴컴 , 컴컴 컴 컴컴컴 컴컴컴 컴컴컴컴컴컴 컴컴컴컴 . • kotlinx - locale 컴 컴컴컴컴 컴컴컴컴 컴컴컴 컴컴컴컴컴컴컴 . 컴컴컴 컴컴컴컴컴 컴컴 . , 컴컴컴컴 , KMP 컴컴