utf8_decode

UTF-8 エンコードされた文字列を、ISO-8859-1 に変換し、表現できない文字を置換する

警告

この関数は PHP 8.2.0 で 非推奨になります。この関数に頼らないことを強く推奨します。

説明

string utf8_decode(string $string)

この関数は、文字列 stringUTF-8 エンコードから ISO-8859-1 へ変換します。 有効な UTF-8 ではない文字列バイト、 および ISO-8859-1 に存在しない UTF-8 の文字 (つまり、U+00FF 以降のコードポイント) は、 ? に置き換えられます。

注意:

ISO-8859-1 文字エンコーディングを使っているとマークされている 多くの Web ページが、実際にはそれと似た Windows-1252 を使っており、 Web ブラウザは ISO-8859-1 Web ページを Windows-1252 として解釈しています。Windows-1252ISO-8859-1 のある制御文字の代わりに、ユーロ記号 () や curly quote ( ) を印字可能な文字として追加しています。 この関数はそうした Windows-1252 文字を正しく変換しません。 Windows-1252 の変換が必要な場合は、別の関数を使ってください。

パラメータ

string

UTF-8 エンコードされた文字列。

戻り値

string を ISO-8859-1 に変換した結果を返します。

変更履歴

バージョン 説明
8.2.0 この関数は、推奨されなくなりました。
7.2.0 この関数は、XML拡張モジュールから PHP のコアに移動しました。 これより前のバージョンでは、 この関数は XML拡張モジュール をインストールしていた場合にのみ利用可能でした。

例1 基本的な例

<?php
// Convert the string 'Zoë' from UTF-8 to ISO 8859-1
$utf8_string = "\x5A\x6F\xC3\xAB";
$iso8859_1_string = utf8_decode($utf8_string);
echo bin2hex($iso8859_1_string), "\n";
// Invalid UTF-8 sequences are replaced with '?'
$invalid_utf8_string = "\xC3";
$iso8859_1_string = utf8_decode($invalid_utf8_string);
var_dump($iso8859_1_string);
// Characters which don't exist in ISO 8859-1, such as
// '€' (Euro Sign) are also replaced with '?'
$utf8_string = "\xE2\x82\xAC";
$iso8859_1_string = utf8_decode($utf8_string);
var_dump($iso8859_1_string);
?>

上の例の出力は以下となります。

5a6feb
string(1) "?"
string(1) "?"

注意

注意: この関数は推奨されません。代替については下記のとおりです。

この関数は、PHP 8.2.0 以降は推奨されなくなり、 将来のバージョンで削除される予定です。 この関数を使っているコードをチェックし、適切な代替に置き換えるべきです。

この関数と似た機能は、 mb_convert_encoding で実現できます。 この関数は、ISO-8859-1 と、多くの他の文字エンコーディングをサポートしています。

<?php
$utf8_string = "\xC3\xAB"; // 'ë' (e with diaeresis) in UTF-8
$iso8859_1_string = mb_convert_encoding($utf8_string, 'ISO-8859-1', 'UTF-8');
echo bin2hex($iso8859_1_string), "\n";

$utf8_string = "\xCE\xBB"; // 'λ' (Greek lower-case lambda) in UTF-8
$iso8859_7_string = mb_convert_encoding($utf8_string, 'ISO-8859-7', 'UTF-8');
echo bin2hex($iso8859_7_string), "\n";

$utf8_string = "\xE2\x82\xAC"; // '€' (Euro sign) in UTF-8 (not present in ISO-8859-1)
$windows_1252_string = mb_convert_encoding($utf8_string, 'Windows-1252', 'UTF-8');
echo bin2hex($windows_1252_string), "\n";
?>

上の例の出力は以下となります。

eb
eb
80

他の代替として、インストールされている拡張機能に依存した関数ですが、 UConverter::transcodeiconv が挙げられます。

次のコードは、いずれも同じ結果を返します:

<?php
$utf8_string = "\x5A\x6F\xC3\xAB"; // 'Zoë' in UTF-8
$iso8859_1_string = utf8_decode($utf8_string);
echo bin2hex($iso8859_1_string), "\n";

$iso8859_1_string = mb_convert_encoding($utf8_string, 'ISO-8859-1', 'UTF-8');
echo bin2hex($iso8859_1_string), "\n";

$iso8859_1_string = iconv('UTF-8', 'ISO-8859-1', $utf8_string);
echo bin2hex($iso8859_1_string), "\n";

$iso8859_1_string = UConverter::transcode($utf8_string, 'ISO-8859-1', 'UTF8');
echo bin2hex($iso8859_1_string), "\n";
?>

上の例の出力は以下となります。

5a6feb
5a6feb
5a6feb
5a6feb
UConverter::transcode'to_subst' オプションとして '?' を指定すると、 ISO-8859-1 で表現できないか、不正な文字列の場合の utf8_decode 関数と同じ結果を返します。
<?php
$utf8_string = "\xE2\x82\xAC"; // € (Euro Sign) does not exist in ISO 8859-1
$iso8859_1_string = UConverter::transcode(
    $utf8_string, 'ISO-8859-1', 'UTF-8', ['to_subst' => '?']
);
var_dump($iso8859_1_string);
?>

上の例の出力は以下となります。

sring(1) "?"

参考

  • utf8_encode
  • mb_convert_encoding
  • UConverter::transcode
  • iconv