UConverter::transcode

ある文字エンコーディングから別の文字エンコーディングに文字列を変換する

説明

public static stringfalse UConverter::transcode(
    string $str,
    string $toEncoding,
    string $fromEncoding,
    arraynull $options = null
)

文字列 str の文字エンコーディングを、 fromEncoding から toEncoding に変換します。

パラメータ

str

変換する文字列。

toEncoding

変換したいエンコーディング。

fromEncoding

str の解釈に使われる文字セット。

options

オプションの配列。以下のキーが使えます:

  • 'to_subst' - toEncoding ではエンコードできない str の文字を置き換えるのに使う文字。 これを指定する場合、 変換先のエンコーディングのうちの一文字でなければいけません。

戻り値

変換後の文字列を返します。 失敗した場合に false を返します

例1 UTF-8 から UTF-16 に変換し、UTF-8 に戻す例

<?php
$utf8_string = "\x5A\x6F\xC3\xAB"; // 'Zoë' in UTF-8
$utf16_string = UConverter::transcode($utf8_string, 'UTF-16BE', 'UTF-8');
echo bin2hex($utf16_string), "\n";
$new_utf8_string = UConverter::transcode($utf16_string, 'UTF-8', 'UTF-16BE');
echo bin2hex($new_utf8_string), "\n";
?>

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

005a006f00eb
5a6fc3ab

例2 入力に不正な文字が含まれていた場合

入力文字列に fromEncoding では不正なバイト列が含まれていた場合、 Unicode のコードポイント U+FFFD (置換文字) に置き換えられます。 この置き換えは、toEncoding に変換する前に行われます。

<?php
$invalid_utf8_string = "\xC3"; // incomplete multi-byte UTF-8 sequence
$utf16_string = UConverter::transcode($invalid_utf8_string, 'UTF-16BE', 'UTF-8');
echo bin2hex($utf16_string), "\n";
?>

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

fffd

例3 エンコードできない文字

入力文字列に toEncoding で表現できない文字が含まれていた場合、 それらは一文字で置換されます。 置換に使われる文字はエンコーディングに依存しますが、 'to_subst' を使って制御できます。

<?php
$utf8_string = "\xE2\x82\xAC"; // € (Euro Sign) does not exist in ISO 8859-1
// Default replacement in ISO 8859-1 is "\x1A" (Substitute)
$iso8859_1_string = UConverter::transcode($utf8_string, 'ISO-8859-1', 'UTF-8');
echo bin2hex($iso8859_1_string), "\n";
// Specify a replacement of '?' ("\x3F") instead
$iso8859_1_string = UConverter::transcode(
    $utf8_string, 'ISO-8859-1', 'UTF-8', ['to_subst' => '?']
);
echo bin2hex($iso8859_1_string), "\n";
// Since ISO 8859-1 cannot map U+FFFD, invalid input is also replaced by to_subst
$invalid_utf8_string = "\xC3"; // incomplete multi-byte UTF-8 sequence
$iso8859_1_string = UConverter::transcode(
    $invalid_utf8_string, 'ISO-8859-1', 'UTF-8', ['to_subst' => '?']
);
echo bin2hex($iso8859_1_string), "\n";
?>

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

1a
3f
3f

参考

  • mb_convert_encoding
  • iconv