大文字・小文字変換
アルファベットの大文字 (uppercase) と小文字 (lowercase) を相互に変換する処理。言語によって変換規則が異なり、文字数が変化するケースもある。
大文字・小文字変換 (case conversion) は、テキスト処理で最も頻繁に行われる操作の一つです。英語では「A」→「a」(小文字化) や「hello」→「HELLO」(大文字化) のように、26 文字のアルファベットが 1 対 1 で対応します。しかし、世界の言語に目を向けると、大文字・小文字の変換は驚くほど複雑です。
最も有名な例外はドイツ語のエスツェット「ß」です。小文字の「ß」を大文字化すると「SS」(2 文字) になります。つまり、大文字化によって文字数が増えるのです。2017 年に Unicode 5.1 で大文字の「ẞ」が追加されましたが、ドイツ語の正書法では依然として「SS」への変換が標準です。トルコ語では「i」の大文字が「İ」(上にドット付き)、「I」の小文字が「ı」(ドットなし) であり、英語の変換規則とは異なります。
プログラミングでは、大文字・小文字を区別しない比較 (case-insensitive comparison) が頻繁に必要になります。メールアドレスのローカル部分は大文字・小文字を区別しますが、ドメイン部分は区別しません。URL のスキーム (http/HTTP) やホスト名は区別しませんが、パス部分は区別します。こうした仕様の違いを正しく処理するには、どの部分で case-insensitive な比較を行うかを明確にする必要があります。
JavaScript の toLowerCase() と toUpperCase() は Unicode 対応ですが、ロケール依存の変換には toLocaleLowerCase() を使う必要があります。トルコ語ロケールで 'I'.toLocaleLowerCase('tr') を実行すると「ı」が返り、英語ロケールでは「i」が返ります。ロケールを無視した変換は、国際化対応のバグの温床です。
命名規則としての大文字・小文字の使い分けも重要です。camelCase (キャメルケース)、PascalCase (パスカルケース)、snake_case (スネークケース)、kebab-case (ケバブケース)、SCREAMING_SNAKE_CASE (定数) など、プログラミングでは大文字・小文字のパターンが意味を持ちます。これらの変換は単純な大文字化・小文字化ではなく、単語の境界を認識した上での変換が必要です。
文字数カウントの観点では、大文字・小文字変換で文字数が変わるケースに注意が必要です。前述のドイツ語「ß」→「SS」のほか、ギリシャ語の「ς」(語末のシグマ) →「Σ」→「σ」(語中のシグマ) のように、位置によって小文字の形が変わる言語もあります。文字数制限のあるフィールドで大文字化を行う場合、変換後に文字数が制限を超える可能性を考慮する必要があります。