PHPで「大文字変換」といっても、実際にはいくつかのパターンがあります。
文字列全体を大文字にしたい場合もあれば、先頭1文字だけを大文字にしたい場合、あるいは各単語の先頭を大文字にしたい場合もあります。
さらに重要なのが、英数字中心の文字列なのか、UTF-8のようなマルチバイト文字列を含むのかという点です。
この違いによって、使うべき関数が変わります。
PHPでよく使う大文字変換の関数は、主に次の4つです。
strtoupper($str); // 文字列全体を大文字にする
ucfirst($str); // 先頭1文字を大文字にする
ucwords($str); // 各単語の先頭を大文字にする
mb_strtoupper($str, 'UTF-8'); // マルチバイト対応で文字列全体を大文字にする
strtoupper() で文字列全体を大文字にする
文字列全体を大文字にしたいときに使う基本の関数が strtoupper() です。
<?php
$text = "hello world";
echo strtoupper($text); // HELLO WORLD
この関数は、英数字中心の文字列をまとめて大文字にしたいときに便利です。
ただし、ここで注意が必要です。
現在のPHPでは、strtoupper() はASCII文字に対する大文字変換として考えるのが正確です。
そのため、英語のアルファベットのような単純なケースには向いていますが、多言語文字列の大文字変換には適していません。
たとえば、英字だけなら問題ありません。
<?php
echo strtoupper("php"); // PHP
echo strtoupper("hello"); // HELLO
一方で、UTF-8文字列やアクセント付き文字を含む場合は、mb_strtoupper() を使う方が安全です。
ucfirst() で先頭1文字だけを大文字にする
文字列の先頭だけを大文字にしたい場合には、ucfirst() を使います。
<?php
$text = "hello world";
echo ucfirst($text); // Hello world
この関数は、文頭を大文字に整えたいときによく使われます。
ただし、これも実務では注意が必要です。
ucfirst() は「どんな文字でも先頭を大文字にする」と思われがちですが、現行PHPでは、先頭文字がASCIIの小文字英字である場合に大文字化すると考える方が正確です。
たとえば、次のようなケースでは期待どおりに動きます。
<?php
echo ucfirst("php"); // Php
echo ucfirst("hello"); // Hello
しかし、多言語文字列全般に対して万能ではありません。
先頭だけ大文字、残りを小文字にしたい場合
よくあるのが、「全文が大文字やバラバラの状態なので、先頭だけ大文字にして残りは小文字にしたい」というケースです。
その場合は、次のような書き方が使われます。
<?php
$text = "HELLO WORLD";
echo ucfirst(strtolower($text)); // Hello world
この方法は英数字中心の文字列ではとても実用的です。
ただし、strtolower() も ucfirst() もASCIIベースのケース変換として考えるべきなので、マルチバイト文字列に対しては万能ではないという点には注意してください。
ucwords() で各単語の先頭を大文字にする
英語のタイトルのように、各単語の頭文字を大文字にしたい場合は ucwords() を使います。
<?php
$text = "hello world from php";
echo ucwords($text); // Hello World From Php
この関数は、単語ごとに先頭文字を大文字にしてくれます。
そのため、見出しやタイトルの整形によく使われます。
たとえば、すべて小文字の文字列をタイトル風に整えたい場合に便利です。
<?php
echo ucwords("php string function"); // Php String Function
ただし、これも ucfirst() と同じく、基本的にはASCII文字を前提に理解するのが安全です。
日本語や多言語文字列を含む場合には、思った通りの結果にならないことがあります。
mb_strtoupper() でマルチバイト対応の大文字変換を行う
UTF-8文字列や多言語文字列を扱う場合に重要なのが mb_strtoupper() です。
<?php
$text = "straße";
echo mb_strtoupper($text, 'UTF-8');
この関数は、マルチバイト文字列向けの大文字変換関数です。
英字以外を含む文字列や、国際化対応が必要な場面では、strtoupper() よりもこちらを使う方が適切です。
特に実務で重要なのは、変換後に文字数が変わる場合があるという点です。
たとえば、特定の言語では大文字変換によって文字列長が変化することがあります。
そのため、文字数制限や切り出し処理を行う場合には、大文字変換の前後で挙動が変わる可能性があります。
つまり、mb_strtoupper() は単なる「安全版の strtoupper()」ではなく、多言語環境に対応した文字変換関数として理解しておくとよいです。
mb_ucfirst() でマルチバイト文字列の先頭だけを大文字にする
PHP 8.4以降では、mb_ucfirst() も使えます。
<?php
$text = "éclair";
echo mb_ucfirst($text, 'UTF-8');
これは、マルチバイト文字列に対応した ucfirst() です。
先頭1文字だけを安全に大文字化したい場合に便利です。
ただし、古いPHP環境では使えないことがあるため、その場合は次のように代替実装する方法があります。
<?php
function mb_ucfirst_fallback(string $text, string $encoding = 'UTF-8'): string
{
$first = mb_substr($text, 0, 1, $encoding);
$rest = mb_substr($text, 1, null, $encoding);
return mb_strtoupper($first, $encoding) . $rest;
}
このように、先頭1文字を切り出して大文字化し、残りと連結することで同様の処理が可能です。
日本語は大文字・小文字の変換対象ではない
ここは誤解しやすいポイントです。
日本語には、英字のような大文字・小文字の区別がありません。
そのため、次のようなコードを書いても、通常は見た目に変化はありません。
<?php
echo strtoupper("こんにちは");
echo mb_strtoupper("こんにちは", "UTF-8");
つまり、大文字変換が意味を持つのは、英字や大文字・小文字の概念を持つ文字体系に対してです。
日本語文字列そのものを変形したい場合は、大文字変換ではなく、別の文字列処理を考える必要があります。
実務での使い分け
PHPの大文字変換は、次のように使い分けると分かりやすいです。
英数字中心の文字列なら strtoupper()
<?php
echo strtoupper("php"); // PHP
IDやコード、英字ラベルなど、ASCII中心の文字列であればこれで十分です。
先頭だけを大文字にしたいなら ucfirst()
<?php
echo ucfirst("hello"); // Hello
文頭だけ整えたい場合に使えます。
各単語の頭文字を大文字にしたいなら ucwords()
<?php
echo ucwords("hello world"); // Hello World
タイトル表示などに向いています。
UTF-8や多言語対応が必要なら mb_strtoupper()
<?php
echo mb_strtoupper("straße", "UTF-8");
国際化対応を考えるなら、こちらを優先する方が安全です。
注意しておきたいポイント
PHPの大文字変換では、次の点を覚えておくと失敗しにくくなります。
まず、strtoupper() や ucfirst()、ucwords() は、何となく「どんな文字列にも使える」と思われがちですが、現行PHPではASCIIベースのケース変換関数として理解する方が正確です。
次に、多言語文字列を扱う場合は、mb_* 系の関数を優先した方が安全です。
英語だけを扱う小規模な処理なら問題ありませんが、海外言語や特殊文字を含むデータを扱う場合には、通常の文字列関数だけでは不十分になることがあります。
さらに、マルチバイト文字列では、大文字変換後に文字数が変わるケースもあるため、バリデーションや文字数制限と組み合わせるときは注意が必要です。
まとめ
PHPで大文字変換を行う場合は、目的に応じて関数を使い分けることが大切です。
- 文字列全体を大文字にするなら
strtoupper() - 先頭1文字だけ大文字にするなら
ucfirst() - 各単語の先頭を大文字にするなら
ucwords() - UTF-8や多言語対応なら
mb_strtoupper() - マルチバイト文字列の先頭だけを大文字にしたいなら
mb_ucfirst()を使う
ただし、strtoupper()、ucfirst()、ucwords() は、現行PHPではASCIIベースの変換として理解するのが安全です。
多言語対応が必要な場合は、最初から mb_* 関数を使う意識を持っておくと、後から不具合が起きにくくなります。
以上、PHPの大文字変換についてでした。
最後までお読みいただき、ありがとうございました。










