【PHP8.x】utf8_encode関数の使い方

utf8_encode関数の使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

utf8_encode関数は、ISO-8859-1エンコーディングで記述された文字列を、Webや多くのシステムで広く利用されているUTF-8エンコーディングに変換する関数です。主に、古いシステムやデータベースから取得したデータがISO-8859-1形式であった場合に、それをPHPアプリケーション内でUTF-8として安全に処理したい場面で利用されてきました。

この関数は、変換したいISO-8859-1形式の文字列を引数として受け取り、変換が成功した場合はUTF-8形式の文字列を返します。変換に失敗した場合は、falseが返されます。

しかしながら、PHP 8.2.0バージョンより、utf8_encode関数は非推奨(deprecated)となりました。これは、この関数が特定のエンコーディング間(ISO-8859-1からUTF-8)の変換にしか対応しておらず、現代の多様なエンコーディング要件に対応できないためです。さらに、将来のPHP 9.0.0バージョンでは削除される予定です。

そのため、新規に開発するアプリケーションではこの関数を使用せず、代わりに、より多くのエンコーディングタイプをサポートし、柔軟な変換が可能なmb_convert_encoding関数やiconv関数を使用することが強く推奨されます。これらの代替関数は、現在のPHPアプリケーション開発において、文字エンコーディング変換の標準的な方法として広く利用されています。古い既存のコードの保守や特定のレガシーシステムとの連携時を除き、新しいコードでは代替関数を利用するようにしてください。

構文(syntax)

1<?php
2$iso88591_string_data = "Ceci est un exemple en français.";
3$utf8_encoded_string = utf8_encode($iso88591_string_data);
4?>

引数(parameters)

string $string

  • string $string: UTF-8にエンコードしたい文字列を指定します

戻り値(return)

string|false

UTF-8エンコーディングに変換された文字列、または変換に失敗した場合はfalseを返します。

サンプルコード

PHP utf8_encode 非推奨と代替

1<?php
2
3/**
4 * PHP の非推奨関数 `utf8_encode` の使用例と、推奨される代替方法を示すサンプルコードです。
5 *
6 * `utf8_encode` 関数は PHP 8.2 で非推奨となり、PHP 9.0 で削除される予定です。
7 * この関数は、ISO-8859-1 エンコーディングの文字列を UTF-8 に変換するために設計されました。
8 *
9 * 代替として、`mb_convert_encoding` 関数を使用することが推奨されます。
10 * `mb_convert_encoding` を使用して同様の変換を行うには、
11 * ソースエンコーディングを 'ISO-8859-1'、ターゲットエンコーディングを 'UTF-8' と明示的に指定します。
12 */
13
14/**
15 * 非推奨の `utf8_encode` 関数とその推奨される代替方法をデモンストレーションします。
16 *
17 * この関数は、ISO-8859-1 から UTF-8 への文字列エンコーディング変換の例を示します。
18 */
19function demonstrateUtf8EncodeDeprecation(): void
20{
21    // ISO-8859-1 エンコーディングであると仮定する文字列の例。
22    // utf8_encode は ISO-8859-1 からのみ変換を行うため、このエンコーディングを想定します。
23    // 日本語のようなマルチバイト文字は ISO-8859-1 では正しく表現できません。
24    $iso88591String = "Ceci est un test avec des caractères accentués: éàçü";
25
26    echo "--- 元の文字列 ---" . PHP_EOL;
27    echo "元の文字列 (ISO-8859-1 と仮定): " . $iso88591String . PHP_EOL . PHP_EOL;
28
29    // --- 非推奨の utf8_encode 関数を使用する例 ---
30    // PHP 8.2 以降でこのコードを実行すると、非推奨の警告 (Deprecation Warning) が発生する可能性があります。
31    // PHP 9.0 ではこの関数は完全に削除され、致命的なエラー (Fatal Error) となります。
32    $utf8EncodedByOldFunction = utf8_encode($iso88591String);
33    echo "--- utf8_encode による変換結果 (非推奨) ---" . PHP_EOL;
34    echo "結果: " . $utf8EncodedByOldFunction . PHP_EOL;
35    // 変換後のエンコーディングを確認
36    echo "検出されたエンコーディング: " . mb_detect_encoding($utf8EncodedByOldFunction, 'UTF-8,ISO-8859-1', true) . PHP_EOL . PHP_EOL;
37
38    // --- 推奨される代替方法: mb_convert_encoding を使用する例 ---
39    // utf8_encode と同じ変換 (ISO-8859-1 から UTF-8) を mb_convert_encoding で行います。
40    $utf8EncodedByMbConvert = mb_convert_encoding($iso88591String, 'UTF-8', 'ISO-8859-1');
41    echo "--- mb_convert_encoding による変換結果 (推奨される代替) ---" . PHP_EOL;
42    echo "結果: " . $utf8EncodedByMbConvert . PHP_EOL;
43    // 変換後のエンコーディングを確認
44    echo "検出されたエンコーディング: " . mb_detect_encoding($utf8EncodedByMbConvert, 'UTF-8,ISO-8859-1', true) . PHP_EOL . PHP_EOL;
45
46    // 両者の結果が同じであることを確認
47    echo "--- 結果の比較 ---" . PHP_EOL;
48    if ($utf8EncodedByOldFunction === $utf8EncodedByMbConvert) {
49        echo "utf8_encode と mb_convert_encoding の結果は同じです。これにより、代替が適切であることが確認できます。" . PHP_EOL;
50    } else {
51        echo "utf8_encode と mb_convert_encoding の結果は異なります。" . PHP_EOL;
52    }
53}
54
55// デモンストレーション関数を実行します。
56demonstrateUtf8EncodeDeprecation();
57
58?>

PHPのutf8_encode関数は、指定された文字列をISO-8859-1エンコーディングからUTF-8エンコーディングに変換するために使用されます。この関数は引数として変換したい文字列(string $string)を受け取り、成功すればUTF-8エンコードされた文字列を返しますが、変換に失敗した場合はfalseを返します。

しかし、このutf8_encode関数は、PHP 8.2で非推奨(deprecated)となり、PHP 9.0で完全に削除される予定です。これは、特定のエンコーディングにのみ対応しているため、より汎用的な文字列エンコーディング変換が可能な関数が推奨されているためです。

サンプルコードでは、まず非推奨のutf8_encode関数を使用して、ISO-8859-1と仮定した文字列をUTF-8に変換する例を示しています。この部分のコードをPHP 8.2以降で実行すると、非推奨の警告が表示される可能性があります。

この関数の代替として、mb_convert_encoding関数の利用が強く推奨されます。mb_convert_encodingを使用すると、変換元のエンコーディングを'ISO-8859-1'、変換先のエンコーディングを'UTF-8'と明示的に指定することで、utf8_encodeと同様の変換をより柔軟かつ安全に実行できます。サンプルコードでは、mb_convert_encodingによる変換結果も示されており、非推奨関数と同じ結果が得られることが確認できます。システム開発においては、将来的な互換性とコードのメンテナンス性を考慮し、mb_convert_encodingのような推奨される関数を使用することが重要です。

utf8_encode関数はPHP 8.2で非推奨となり、PHP 9.0で完全に削除されるため、新規コードでの使用は避けてください。既存のコードに含まれる場合は、PHPのバージョンアップ時にエラーとなる可能性があるため、早急に代替関数への移行が必要です。この関数は、ISO-8859-1エンコーディングの文字列をUTF-8に変換することに特化しており、それ以外のエンコーディングには対応していません。安全かつ汎用的な文字列エンコーディング変換を行うには、mb_convert_encoding関数を使用することが推奨されます。mb_convert_encodingを使用する際は、変換元のエンコーディングと変換先のエンコーディングを引数で明示的に指定する必要があります。例えば、ISO-8859-1からUTF-8へ変換する場合は、mb_convert_encoding($string, 'UTF-8', 'ISO-8859-1')と記述します。

utf8_encodeの誤解と正しい使い方

1<?php
2
3/**
4 * utf8_encode が「うまく動作しない」とされる一般的な理由を実演し、
5 * 正しいエンコーディング変換方法を示します。
6 *
7 * utf8_encode 関数は、ISO-8859-1 (Latin-1) エンコーディングの文字列を UTF-8 に変換することを目的としています。
8 * そのため、入力文字列が Latin-1 ではない場合、期待通りに動作せず、文字化けや誤った結果を招きます。
9 * より汎用的なエンコーディング変換には、mb_convert_encoding 関数を使用するのが適切です。
10 */
11function demonstrateUtf8EncodeBehavior(): void
12{
13    echo "--- utf8_encode の意図された動作 (Latin-1 から UTF-8 への変換) ---" . PHP_EOL;
14
15    // Latin-1 文字 'ç' (0xE7) と 'é' (0xE9) を含む文字列を、バイト列で表現します。
16    // PHPはデフォルトでUTF-8環境で動作することが多いため、直接入力するとUTF-8として扱われます。
17    // 実際のLatin-1データをシミュレートするために、pack()でバイト列を生成します。
18    $rawLatin1Bytes = pack('C*', 0x43, 0x65, 0x63, 0x69, 0x20, 0x65, 0x73, 0x74, 0x20, 0x75, 0x6E, 0x20, 0x74, 0x65, 0x73, 0x74, 0x20, 0x65, 0x6E, 0x20, 0x66, 0x72, 0x61, 0x6E, 0xE7, 0x61, 0x69, 0x73, 0x20, 0x61, 0x76, 0x65, 0x63, 0x20, 0x75, 0x6E, 0x20, 0xE9, 0x2E);
19    // 元の Latin-1 文字列 (表示のため。環境によっては既に文字化けしている可能性あり)
20    echo "元の Latin-1 (文字列表現、環境依存): " . $rawLatin1Bytes . PHP_EOL;
21    echo "元の Latin-1 (バイト列): " . bin2hex($rawLatin1Bytes) . PHP_EOL;
22
23    // Latin-1 文字列を utf8_encode で UTF-8 に変換します。
24    $utf8EncodedString = utf8_encode($rawLatin1Bytes);
25
26    echo "utf8_encode で変換後 (UTF-8): " . $utf8EncodedString . PHP_EOL;
27    echo "変換後のバイト列 (C3 A7 は 'ç', C3 A9 は 'é'): " . bin2hex($utf8EncodedString) . PHP_EOL . PHP_EOL;
28
29
30    echo "--- utf8_encode が「動作しない」とされる一般的な例 (非 Latin-1 からの誤用) ---" . PHP_EOL;
31
32    // 例: Shift_JIS でエンコードされた日本語文字列「こんにちは」
33    // Shift_JIS のバイト列 (8F388F438F588F608FB1) を pack() で生成します。
34    $shiftJisString = pack('H*', '8F388F438F588F608FB1');
35
36    echo "元の Shift_JIS (文字列表現、環境によっては文字化け): " . $shiftJisString . PHP_EOL;
37    echo "元の Shift_JIS (バイト列): " . bin2hex($shiftJisString) . PHP_EOL;
38
39    // Shift_JIS の文字列を utf8_encode に渡すと、Latin-1 と仮定されるため、
40    // 意図しない結果(文字化け)が発生します。
41    $garbledString = utf8_encode($shiftJisString);
42
43    echo "utf8_encode で変換後 (文字化け): " . $garbledString . PHP_EOL;
44    echo "なぜ「動作しない」のか: utf8_encode は入力が Latin-1 であると仮定します。" . PHP_EOL;
45    echo "Shift_JIS のバイト列を Latin-1 として解釈し、その結果を UTF-8 に変換するため、" . PHP_EOL;
46    echo "意図しない文字が出力され、文字化けが発生します。" . PHP_EOL . PHP_EOL;
47
48
49    echo "--- 汎用的なエンコーディング変換のための解決策 (mb_convert_encoding) ---" . PHP_EOL;
50
51    // Shift_JIS から UTF-8 への正しい変換には mb_convert_encoding を使用します。
52    // 変換元のエンコーディングを明示的に指定することが重要です。
53    $correctUtf8String = mb_convert_encoding($shiftJisString, 'UTF-8', 'Shift_JIS');
54
55    echo "mb_convert_encoding で変換後 (Shift_JIS -> UTF-8): " . $correctUtf8String . PHP_EOL;
56    echo "mb_convert_encoding で変換後のバイト列: " . bin2hex($correctUtf8String) . PHP_EOL;
57    echo "解決策: 入力エンコーディングが Latin-1 ではない、または不明な場合は、" . PHP_EOL;
58    echo "mb_convert_encoding() 関数を使用して、変換元のエンコーディングを明示的に指定してください。" . PHP_EOL;
59}
60
61// 関数を実行して動作を確認します。
62demonstrateUtf8EncodeBehavior();

PHPのutf8_encode関数は、ISO-8859-1 (Latin-1) エンコーディングの文字列をUTF-8に変換するために利用されます。引数$stringにLatin-1形式の文字列を渡すと、UTF-8形式の文字列を返しますが、変換に失敗した場合はfalseを返します。この関数は、入力文字列がLatin-1であると厳密に仮定して動作します。

utf8_encodeがうまく動作しない」とされる一般的な理由は、入力文字列がLatin-1ではない場合に使用されているためです。例えば、Shift_JISやEUC-JPのような日本語エンコーディングの文字列をutf8_encodeに渡すと、関数はそれらをLatin-1のバイト列として誤って解釈し、結果として意図しない文字(文字化け)が返されます。これは、utf8_encodeがLatin-1以外のエンコーディングを正しく扱えないためです。

このような問題を解決し、より多様なエンコーディングの文字列をUTF-8に変換するには、mb_convert_encoding関数を使用するのが適切です。mb_convert_encodingは、変換したい文字列、目的のエンコーディング(例: 'UTF-8')、そして変換元のエンコーディングを明示的に指定できるため、入力エンコーディングがLatin-1以外の場合でも正確な変換が可能です。これにより、意図しない文字化けを防ぎ、汎用的なエンコーディング変換を実現できます。

utf8_encode関数は、入力文字列がISO-8859-1(Latin-1)エンコーディングであると厳密に仮定し、それをUTF-8に変換します。このため、入力がLatin-1以外(例えば、Shift_JISの日本語や、すでにUTF-8の文字列)であると、期待通りに動作せず、文字化けの原因となります。これが「うまく動作しない」とされる主な理由です。異なるエンコーディング間の変換には、より汎用的なmb_convert_encoding関数を使用し、変換元のエンコーディングを明示的に指定することが推奨されます。mb_convert_encodingを使うことで、多様な文字エンコーディングに対応し、安全で正確な変換が可能です。

関連コンテンツ

【PHP8.x】utf8_encode関数の使い方 | いっしー@Webエンジニア