(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL >= 3.0.0a1)
UConverter::transcode — ある文字エンコーディングから別の文字エンコーディングに文字列を変換する
$str
,$toEncoding
,$fromEncoding
,$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