대소문자 변환
문자를 대문자, 소문자, 제목 대문자로 변환하는 규칙. 로케일에 따라 달라질 수 있으며(터키어 I 문제), 일대다 매핑도 가능합니다(ß → SS).
What Is Unicode Case Mapping?
Case mapping is the process of converting a string to its uppercase, lowercase, or titlecase form. While most programmers know str.upper() and str.lower() from ASCII, Unicode case mapping is vastly more complex: it is locale-sensitive, context-sensitive, and sometimes involves one-to-many mappings where a single character maps to multiple characters.
Every cased character in Unicode has three case-mapping properties: Uppercase_Mapping, Lowercase_Mapping, and Titlecase_Mapping. For most characters these are simple one-to-one mappings, but the Unicode Standard specifies special cases that require careful handling.
Notable Special Cases
German ß (LATIN SMALL LETTER SHARP S):
- Lowercase: ß (unchanged)
- Uppercase: SS (two characters!)
- This is a one-to-many mapping: "straße".upper() → "STRASSE"
Turkish/Azerbaijani dotted and dotless I:
- Turkish has four I characters: I (capital, dotless), İ (capital, dotted), ı (small, dotless), i (small, dotted)
- Correct Turkish uppercasing: i → İ (NOT I); ı → I (NOT i)
- Python's default locale-insensitive str.upper() gives the wrong result for Turkish
Greek final sigma ς (U+03C2): - Used only at the end of a word; otherwise σ (U+03CF) is used - Uppercasing: ς → Σ (same as σ) - Lowercasing: Σ → σ or ς depending on position (context-sensitive)
# Simple case mapping
print("hello".upper()) # HELLO
print("HELLO".lower()) # hello
print("hello world".title()) # Hello World
# German ß one-to-many
sharp_s = "straße"
print(sharp_s.upper()) # STRASSE (ß → SS)
print(len(sharp_s)) # 6
print(len(sharp_s.upper())) # 7
# Turkish locale-sensitive (needs locale or explicit mapping)
import locale
# locale.setlocale(locale.LC_ALL, "tr_TR.UTF-8") # system-dependent
dotted_i = "i"
print(dotted_i.upper()) # I (wrong for Turkish)
# unicodedata does NOT do case mapping; use str methods
import unicodedata
# unicodedata.normalize does not change case
# For advanced case folding, use casefold():
print("straße".casefold()) # strasse (case-fold for comparison)
print("STRASSE".casefold()) # strasse
# Case-insensitive comparison (correct approach):
a = "straße"
b = "STRASSE"
print(a.casefold() == b.casefold()) # True
Case Folding vs Case Mapping
Case folding (str.casefold()) is a more aggressive form of lowercasing designed for case-insensitive comparison. It is not appropriate for display. For example, casefold() maps ß → ss and German ü → ü (same), whereas lower() keeps ß as ß.
Quick Facts
| Property | Value |
|---|---|
| Unicode properties | Uppercase_Mapping, Lowercase_Mapping, Titlecase_Mapping |
| Python functions | str.upper(), str.lower(), str.title(), str.casefold() |
| German ß | upper() → SS (one-to-many mapping) |
| Turkish | Requires locale-sensitive mapping for correct İ/ı handling |
| Greek sigma | Context-sensitive: final ς vs medial σ |
| Case folding | str.casefold() — for comparison, not display |
| Spec reference | Unicode Standard Chapter 3.13, SpecialCasing.txt |
관련 용어
속성의 더 많은 용어
Unicode property (UAX#11) classifying characters as Narrow, Wide, Fullwidth, Halfwidth, Ambiguous, or …
Unicode property controlling how Arabic and Syriac characters connect to adjacent characters. …
Unicode property listing all scripts that use a character, broader than the …
정규 분해 과정에서 결합 기호의 순서를 제어하는 수치 값(0~254)으로, 어떤 결합 기호를 …
마침표, 쉼표, 대시, 따옴표 등 문어를 구성하고 명료하게 하는 데 사용되는 문자. …
지원하지 않는 프로세스에서 눈에 보이는 효과 없이 무시할 수 있는 문자로, 이형 …
문자가 처음 할당된 유니코드 버전. 시스템 및 소프트웨어 버전 간의 문자 지원 …
RTL 문맥에서 글리프를 수평으로 반전해야 하는 문자. 예: ( → ), [ …
문자가 속한 문자 체계(예: 라틴, 키릴, 한자). Unicode 16.0은 168개의 문자 체계를 …
문자를 구성 요소로 분해하는 매핑. 정규 분해는 의미를 보존(é → e + …