From 618d083fad9d3e57cbe9851aa7bfd31d07747cd2 Mon Sep 17 00:00:00 2001 From: svollbehr Date: Wed, 25 Mar 2009 20:02:05 +0000 Subject: [PATCH] Fix a defect in unicode handling git-svn-id: http://php-reader.googlecode.com/svn/trunk@144 51a70ab9-7547-0410-9469-37e369ee0574 --- src/ID3/Frame/APIC.php | 13 +++++-------- src/ID3/Frame/AbstractText.php | 17 +++++------------ src/ID3/Frame/COMM.php | 19 +++++++------------ src/ID3/Frame/COMR.php | 21 ++++++++------------- src/ID3/Frame/GEOB.php | 21 ++++++++------------- src/ID3/Frame/IPLS.php | 19 +++++++------------ src/ID3/Frame/OWNE.php | 14 +++----------- src/ID3/Frame/SYLT.php | 28 ++++++++++------------------ src/ID3/Frame/TXXX.php | 19 +++++++------------ src/ID3/Frame/USER.php | 15 +++------------ src/ID3/Frame/USLT.php | 20 +++++++------------- src/ID3/Frame/WXXX.php | 13 +++++-------- 12 files changed, 75 insertions(+), 144 deletions(-) diff --git a/src/ID3/Frame/APIC.php b/src/ID3/Frame/APIC.php index bf0913c..f5523a0 100644 --- a/src/ID3/Frame/APIC.php +++ b/src/ID3/Frame/APIC.php @@ -124,13 +124,13 @@ final class ID3_Frame_APIC extends ID3_Frame list ($this->_description, $this->_imageData) = $this->_explodeString16($this->_data, 2); $this->_description = $this->_convertString - (Transform::fromString16($this->_description), "utf-16"); + ($this->_description, "utf-16"); break; case self::UTF16BE: list ($this->_description, $this->_imageData) = $this->_explodeString16($this->_data, 2); $this->_description = $this->_convertString - (Transform::fromString16BE($this->_description), "utf-16be"); + ($this->_description, "utf-16be"); break; case self::UTF8: list ($this->_description, $this->_imageData) = @@ -258,15 +258,12 @@ final class ID3_Frame_APIC extends ID3_Frame $data = Transform::toUInt8($this->_encoding) . $this->_mimeType . "\0" . Transform::toUInt8($this->_imageType); switch ($this->_encoding) { - case self::UTF16: case self::UTF16LE: - $data .= Transform::toString16 - ($this->_description, $this->_encoding == self::UTF16 ? - Transform::MACHINE_ENDIAN_ORDER : Transform::LITTLE_ENDIAN_ORDER) . - "\0\0"; + $data .= 0xfeff . $this->_description . "\0\0"; break; + case self::UTF16: case self::UTF16BE: - $data .= Transform::toString16BE($this->_description) . "\0\0"; + $data .= $this->_description . "\0\0"; break; default: $data .= $this->_description . "\0"; diff --git a/src/ID3/Frame/AbstractText.php b/src/ID3/Frame/AbstractText.php index e9c4702..a9c64e3 100644 --- a/src/ID3/Frame/AbstractText.php +++ b/src/ID3/Frame/AbstractText.php @@ -89,13 +89,11 @@ abstract class ID3_Frame_AbstractText extends ID3_Frame switch ($encoding) { case self::UTF16: $this->_text = $this->_convertString - ($this->_explodeString16(Transform::fromString16($this->_data)), - "utf-16"); + ($this->_explodeString16($this->_data), "utf-16"); break; case self::UTF16BE: $this->_text = $this->_convertString - ($this->_explodeString16(Transform::fromString16BE($this->_data)), - "utf-16be"); + ($this->_explodeString16($this->_data), "utf-16be"); break; case self::UTF8: $this->_text = $this->_convertString @@ -170,17 +168,12 @@ abstract class ID3_Frame_AbstractText extends ID3_Frame { $data = Transform::toUInt8($this->_encoding); switch ($this->_encoding) { - case self::UTF16: case self::UTF16LE: - $array = $this->_text; - foreach ($array as &$text) - $text = Transform::toString16($text); - $data .= Transform::toString16 - (implode("\0\0", $array), $this->_encoding == self::UTF16 ? - Transform::MACHINE_ENDIAN_ORDER : Transform::LITTLE_ENDIAN_ORDER); + $data .= 0xfeff . implode(0xfeff . "\0\0", $this->_text); break; + case self::UTF16: case self::UTF16BE: - $data .= Transform::toString16BE(implode("\0\0", $this->_text)); + $data .= implode("\0\0", $this->_text); break; default: $data .= implode("\0", $this->_text); diff --git a/src/ID3/Frame/COMM.php b/src/ID3/Frame/COMM.php index 2e87aff..15e679e 100644 --- a/src/ID3/Frame/COMM.php +++ b/src/ID3/Frame/COMM.php @@ -100,17 +100,16 @@ final class ID3_Frame_COMM extends ID3_Frame list ($this->_description, $this->_text) = $this->_explodeString16($this->_data, 2); $this->_description = $this->_convertString - (Transform::fromString16($this->_description), "utf-16"); - $this->_text = $this->_convertString - (Transform::fromString16($this->_text), "utf-16"); + ($this->_description, "utf-16"); + $this->_text = $this->_convertString($this->_text, "utf-16"); break; case self::UTF16BE: list ($this->_description, $this->_text) = $this->_explodeString16($this->_data, 2); $this->_description = $this->_convertString - (Transform::fromString16BE($this->_description), "utf-16be"); + ($this->_description, "utf-16be"); $this->_text = $this->_convertString - (Transform::fromString16BE($this->_text), "utf-16be"); + ($this->_text, "utf-16be"); break; case self::UTF8: list ($this->_description, $this->_text) = @@ -236,16 +235,12 @@ final class ID3_Frame_COMM extends ID3_Frame { $data = Transform::toUInt8($this->_encoding) . $this->_language; switch ($this->_encoding) { - case self::UTF16: case self::UTF16LE: - $order = $this->_encoding == self::UTF16 ? - Transform::MACHINE_ENDIAN_ORDER : Transform::LITTLE_ENDIAN_ORDER; - $data .= Transform::toString16($this->_description, $order) . "\0\0" . - Transform::toString16($this->_text, $order); + $data .= 0xfeff . $this->_description . "\0\0" . 0xfeff . $this->_text; break; + case self::UTF16: case self::UTF16BE: - $data .= Transform::toString16BE - ($this->_description . "\0\0" . $this->_text); + $data .= $this->_description . "\0\0" . $this->_text; break; default: $data .= $this->_description . "\0" . $this->_text; diff --git a/src/ID3/Frame/COMR.php b/src/ID3/Frame/COMR.php index 2fa3ac2..8ac3f15 100644 --- a/src/ID3/Frame/COMR.php +++ b/src/ID3/Frame/COMR.php @@ -135,18 +135,16 @@ final class ID3_Frame_COMR extends ID3_Frame case self::UTF16: list ($this->_seller, $this->_description, $this->_data) = $this->_explodeString16($this->_data, 3); - $this->_seller = $this->_convertString - (Transform::fromString16($this->_seller), "utf-16"); + $this->_seller = $this->_convertString($this->_seller, "utf-16"); $this->_description = $this->_convertString - (Transform::fromString16($this->_description), "utf-16"); + ($this->_description, "utf-16"); break; case self::UTF16BE: list ($this->_seller, $this->_description, $this->_data) = $this->_explodeString16($this->_data, 3); - $this->_seller = $this->_convertString - (Transform::fromString16BE($this->_seller), "utf-16be"); + $this->_seller = $this->_convertString($this->_seller, "utf-16be"); $this->_description = $this->_convertString - (Transform::fromString16BE($this->_description), "utf-16be"); + ($this->_description, "utf-16be"); break; case self::UTF8: list ($this->_seller, $this->_description, $this->_data) = @@ -379,16 +377,13 @@ final class ID3_Frame_COMR extends ID3_Frame $this->_price . "\0" . $this->_date . $this->_contact . "\0" . Transform::toUInt8($this->_delivery); switch ($this->_encoding) { - case self::UTF16: case self::UTF16LE: - $order = $this->_encoding == self::UTF16 ? - Transform::MACHINE_ENDIAN_ORDER : Transform::LITTLE_ENDIAN_ORDER; - $data .= Transform::toString16($this->_seller, $order) . "\0\0" . - Transform::toString16($this->_description, $order) . "\0\0"; + $data .= 0xfeff . $this->_seller . "\0\0" . 0xfeff . + $this->_description . "\0\0"; break; + case self::UTF16: case self::UTF16BE: - $data .= Transform::toString16BE - ($this->_seller . "\0\0" . $this->_description . "\0\0"); + $data .= $this->_seller . "\0\0" . $this->_description . "\0\0"; break; default: $data .= $this->_seller . "\0" . $this->_description . "\0"; diff --git a/src/ID3/Frame/GEOB.php b/src/ID3/Frame/GEOB.php index 944a164..8f06cac 100644 --- a/src/ID3/Frame/GEOB.php +++ b/src/ID3/Frame/GEOB.php @@ -95,18 +95,16 @@ final class ID3_Frame_GEOB extends ID3_Frame case self::UTF16: list ($this->_filename, $this->_description, $this->_objectData) = $this->_explodeString16($this->_data, 3); - $this->_filename = $this->_convertString - (Transform::fromString16($this->_filename), "utf-16"); + $this->_filename = $this->_convertString($this->_filename, "utf-16"); $this->_description = $this->_convertString - (Transform::fromString16($this->_description), "utf-16"); + ($this->_description, "utf-16"); break; case self::UTF16BE: list ($this->_filename, $this->_description, $this->_objectData) = $this->_explodeString16($this->_data, 3); - $this->_filename = $this->_convertString - (Transform::fromString16BE($this->_filename), "utf-16be"); + $this->_filename = $this->_convertString($this->_filename, "utf-16be"); $this->_description = $this->_convertString - (Transform::fromString16BE($this->_description), "utf-16be"); + ($this->_description, "utf-16be"); break; case self::UTF8: list ($this->_filename, $this->_description, $this->_objectData) = @@ -234,16 +232,13 @@ final class ID3_Frame_GEOB extends ID3_Frame { $data = Transform::toUInt8($this->_encoding) . $this->_mimeType . "\0"; switch ($this->_encoding) { - case self::UTF16: case self::UTF16LE: - $order = $this->_encoding == self::UTF16 ? - Transform::MACHINE_ENDIAN_ORDER : Transform::LITTLE_ENDIAN_ORDER; - $data .= Transform::toString16($this->_filename, $order) . "\0\0" . - Transform::toString16($this->_description, $order) . "\0\0"; + $data .= 0xfeff . $this->_filename . "\0\0" . 0xfeff . + $this->_description . "\0\0"; break; + case self::UTF16: case self::UTF16BE: - $data .= Transform::toString16BE - ($this->_filename . "\0\0" . $this->_description . "\0\0"); + $data .= $this->_filename . "\0\0" . $this->_description . "\0\0"; break; default: $data .= $this->_filename . "\0" . $this->_description . "\0"; diff --git a/src/ID3/Frame/IPLS.php b/src/ID3/Frame/IPLS.php index 2b70086..c661224 100644 --- a/src/ID3/Frame/IPLS.php +++ b/src/ID3/Frame/IPLS.php @@ -82,25 +82,23 @@ final class ID3_Frame_IPLS extends ID3_Frame $encoding = Transform::fromUInt8($this->_data[0]); $data = substr($this->_data, 1); - $order = Transform::MACHINE_ENDIAN_ORDER; switch ($encoding) { case self::UTF16: $data = $this->_explodeString16($data); foreach ($data as &$str) - $str = $this->_convertString - (Transform::fromString16($str, $order), "utf-16"); + $str = $this->_convertString($str, "utf-16"); break; case self::UTF16BE: $data = $this->_explodeString16($data); foreach ($data as &$str) - $str = $this->_convertString - (Transform::fromString16BE($str), "utf-16be"); + $str = $this->_convertString($str, "utf-16be"); break; case self::UTF8: $data = $this->_convertString($this->_explodeString8($data), "utf-8"); break; default: - $data = $this->_convertString($this->_explodeString8($data), "iso-8859-1"); + $data = $this->_convertString + ($this->_explodeString8($data), "iso-8859-1"); } for ($i = 0; $i < count($data) - 1; $i += 2) @@ -169,18 +167,15 @@ final class ID3_Frame_IPLS extends ID3_Frame protected function _getData() { $data = Transform::toUInt8($this->_encoding); - $order = $this->_encoding == self::UTF16 ? - Transform::MACHINE_ENDIAN_ORDER : Transform::LITTLE_ENDIAN_ORDER; foreach ($this->_people as $entry) { foreach ($entry as $key => $val) { switch ($this->_encoding) { - case self::UTF16: case self::UTF16LE: - $data .= Transform::toString16($key, $order) . "\0\0" . - Transform::toString16($val, $order) . "\0\0"; + $data .= 0xfeff . $key . "\0\0" . 0xfeff . $val . "\0\0"; break; + case self::UTF16: case self::UTF16BE: - $data .= Transform::toString16BE($key . "\0\0" . $val . "\0\0"); + $data .= $key . "\0\0" . $val . "\0\0"; break; default: $data .= $key . "\0" . $val . "\0"; diff --git a/src/ID3/Frame/OWNE.php b/src/ID3/Frame/OWNE.php index 74d50fa..3cb7f77 100644 --- a/src/ID3/Frame/OWNE.php +++ b/src/ID3/Frame/OWNE.php @@ -99,12 +99,10 @@ final class ID3_Frame_OWNE extends ID3_Frame switch ($encoding) { case self::UTF16: - $this->_seller = $this->_convertString - (Transform::fromString16($this->_data), "utf-16"); + $this->_seller = $this->_convertString($this->_data, "utf-16"); break; case self::UTF16BE: - $this->_seller = $this->_convertString - (Transform::fromString16BE($this->_data), "utf-16be"); + $this->_seller = $this->_convertString($this->_data, "utf-16be"); break; case self::UTF8: $this->_seller = $this->_convertString @@ -222,14 +220,8 @@ final class ID3_Frame_OWNE extends ID3_Frame $data = Transform::toUInt8($this->_encoding) . $this->_currency . $this->_price . "\0" . $this->_date; switch ($this->_encoding) { - case self::UTF16: case self::UTF16LE: - $data .= Transform::toString16 - ($this->_seller, $this->_encoding == self::UTF16 ? - Transform::MACHINE_ENDIAN_ORDER : Transform::LITTLE_ENDIAN_ORDER); - break; - case self::UTF16BE: - $data .= Transform::toString16BE($this->_seller); + $data .= 0xfeff . $this->_seller; break; default: $data .= $this->_seller; diff --git a/src/ID3/Frame/SYLT.php b/src/ID3/Frame/SYLT.php index 114b80e..009e57a 100644 --- a/src/ID3/Frame/SYLT.php +++ b/src/ID3/Frame/SYLT.php @@ -118,13 +118,13 @@ final class ID3_Frame_SYLT extends ID3_Frame list($this->_description, $this->_data) = $this->_explodeString16($this->_data, 2); $this->_description = $this->_convertString - (Transform::fromString16($this->_description), "utf-16"); + ($this->_description, "utf-16"); break; case self::UTF16BE: list($this->_description, $this->_data) = $this->_explodeString16($this->_data, 2); $this->_description = $this->_convertString - (Transform::fromString16BE($this->_description), "utf-16be"); + ($this->_description, "utf-16be"); break; case self::UTF8: list($this->_description, $this->_data) = @@ -144,14 +144,12 @@ final class ID3_Frame_SYLT extends ID3_Frame case self::UTF16: list($syllable, $this->_data) = $this->_explodeString16($this->_data, 2); - $syllable = $this->_convertString - (Transform::fromString16($syllable), "utf-16"); + $syllable = $this->_convertString($syllable, "utf-16"); break; case self::UTF16BE: list($syllable, $this->_data) = $this->_explodeString16($this->_data, 2); - $syllable = $this->_convertString - (Transform::fromString16BE($syllable), "utf-16be"); + $syllable = $this->_convertString($syllable, "utf-16be"); break; case self::UTF8: list($syllable, $this->_data) = @@ -309,30 +307,24 @@ final class ID3_Frame_SYLT extends ID3_Frame $data = Transform::toUInt8($this->_encoding) . $this->_language . Transform::toUInt8($this->_format) . Transform::toUInt8($this->_type); switch ($this->_encoding) { - case self::UTF16: case self::UTF16LE: - $data .= Transform::toString16 - ($this->_description, $this->_encoding == self::UTF16 ? - Transform::MACHINE_ENDIAN_ORDER : Transform::LITTLE_ENDIAN_ORDER) . - "\0\0"; + $data .= 0xfeff . $this->_description . "\0\0"; break; + case self::UTF16: case self::UTF16BE: - $data .= Transform::toString16BE($this->_description) . "\0\0"; + $data .= $this->_description . "\0\0"; break; default: $data .= $this->_description . "\0"; } foreach ($this->_events as $timestamp => $syllable) { switch ($this->_encoding) { - case self::UTF16: case self::UTF16LE: - $data .= Transform::toString16 - ($syllable, $this->_encoding == self::UTF16 ? - Transform::MACHINE_ENDIAN_ORDER : Transform::LITTLE_ENDIAN_ORDER) . - "\0\0"; + $data .= 0xfeff . $syllable . "\0\0"; break; + case self::UTF16: case self::UTF16BE: - $data .= Transform::toString16BE($syllable) . "\0\0"; + $data .= $syllable . "\0\0"; break; default: $data .= $syllable . "\0"; diff --git a/src/ID3/Frame/TXXX.php b/src/ID3/Frame/TXXX.php index d06fc0f..36fefed 100644 --- a/src/ID3/Frame/TXXX.php +++ b/src/ID3/Frame/TXXX.php @@ -86,17 +86,16 @@ final class ID3_Frame_TXXX extends ID3_Frame_AbstractText list($this->_description, $this->_text) = $this->_explodeString16($this->_data, 2); $this->_description = $this->_convertString - (Transform::fromString16($this->_description), "utf-16"); - $this->_text = $this->_convertString - (array(Transform::fromString16($this->_text)), "utf-16"); + ($this->_description, "utf-16"); + $this->_text = $this->_convertString(array($this->_text), "utf-16"); break; case self::UTF16BE: list($this->_description, $this->_text) = $this->_explodeString16($this->_data, 2); $this->_description = $this->_convertString - (Transform::fromString16BE($this->_description), "utf-16be"); + ($this->_description, "utf-16be"); $this->_text = $this->_convertString - (array(Transform::fromString16BE($this->_text)), "utf-16be"); + (array($this->_text), "utf-16be"); break; case self::UTF8: list($this->_description, $this->_text) = $this->_convertString @@ -139,16 +138,12 @@ final class ID3_Frame_TXXX extends ID3_Frame_AbstractText { $data = Transform::toUInt8($this->_encoding); switch ($this->_encoding) { - case self::UTF16: case self::UTF16LE: - $order = $this->_encoding == self::UTF16 ? - Transform::MACHINE_ENDIAN_ORDER : Transform::LITTLE_ENDIAN_ORDER; - $data .= Transform::toString16($this->_description, $order) . "\0\0" . - Transform::toString16($this->_text[0], $order); + $data .= 0xfeff . $this->_description . "\0\0" . 0xfeff . $this->_text[0]; break; + case self::UTF16: case self::UTF16BE: - $data .= Transform::toString16BE($this->_description) . "\0\0" . - Transform::toString16BE($this->_text[0]); + $data .= $this->_description . "\0\0" . $this->_text[0]; break; default: $data .= $this->_description . "\0" . $this->_text[0]; diff --git a/src/ID3/Frame/USER.php b/src/ID3/Frame/USER.php index b0b6d6b..4f598f3 100644 --- a/src/ID3/Frame/USER.php +++ b/src/ID3/Frame/USER.php @@ -92,12 +92,10 @@ final class ID3_Frame_USER extends ID3_Frame switch ($encoding) { case self::UTF16: - $this->_text = $this->_convertString - (Transform::fromString16($this->_data), "utf-16"); + $this->_text = $this->_convertString($this->_data, "utf-16"); break; case self::UTF16BE: - $this->_text = $this->_convertString - (Transform::fromString16BE($this->_data), "utf-16be"); + $this->_text = $this->_convertString($this->_data, "utf-16be"); break; case self::UTF8: $this->_text = $this->_convertString @@ -189,15 +187,8 @@ final class ID3_Frame_USER extends ID3_Frame { $data = Transform::toUInt8($this->_encoding) . $this->_language; switch ($this->_encoding) { - case self::UTF16: case self::UTF16LE: - $data .= Transform::toString16 - ($this->_text, $this->_encoding == self::UTF16 ? - Transform::MACHINE_ENDIAN_ORDER : Transform::LITTLE_ENDIAN_ORDER); - break; - case self::UTF16BE: - $data .= Transform::toString16BE($this->_text); - break; + $data .= 0xfeff . $this->_text; default: $data .= $this->_text; } diff --git a/src/ID3/Frame/USLT.php b/src/ID3/Frame/USLT.php index aeea686..f5d839e 100644 --- a/src/ID3/Frame/USLT.php +++ b/src/ID3/Frame/USLT.php @@ -97,17 +97,15 @@ final class ID3_Frame_USLT extends ID3_Frame list ($this->_description, $this->_text) = $this->_explodeString16($this->_data, 2); $this->_description = $this->_convertString - (Transform::fromString16($this->_description), "utf-16"); - $this->_text = $this->_convertString - (Transform::fromString16($this->_text), "utf-16"); + ($this->_description, "utf-16"); + $this->_text = $this->_convertString($this->_text, "utf-16"); break; case self::UTF16BE: list ($this->_description, $this->_text) = $this->_explodeString16($this->_data, 2); $this->_description = $this->_convertString - (Transform::fromString16BE($this->_description), "utf-16be"); - $this->_text = $this->_convertString - (Transform::fromString16BE($this->_text), "utf-16be"); + ($this->_description, "utf-16be"); + $this->_text = $this->_convertString($this->_text, "utf-16be"); break; case self::UTF8: list ($this->_description, $this->_text) = @@ -233,16 +231,12 @@ final class ID3_Frame_USLT extends ID3_Frame { $data = Transform::toUInt8($this->_encoding) . $this->_language; switch ($this->_encoding) { - case self::UTF16: case self::UTF16LE: - $order = $this->_encoding == self::UTF16 ? - Transform::MACHINE_ENDIAN_ORDER : Transform::LITTLE_ENDIAN_ORDER; - $data .= Transform::toString16($this->_description, $order) . "\0\0" . - Transform::toString16($this->_text, $order); + $data .= 0xfeff . $this->_description . "\0\0" . 0xfeff . $this->_text; break; + case self::UTF16: case self::UTF16BE: - $data .= Transform::toString16BE($this->_description) . "\0\0" . - Transform::toString16BE($this->_text); + $data .= $this->_description . "\0\0" . $this->_text; break; default: $data .= $this->_description . "\0" . $this->_text; diff --git a/src/ID3/Frame/WXXX.php b/src/ID3/Frame/WXXX.php index 67c523d..9ad9ea7 100644 --- a/src/ID3/Frame/WXXX.php +++ b/src/ID3/Frame/WXXX.php @@ -88,13 +88,13 @@ final class ID3_Frame_WXXX extends ID3_Frame_AbstractLink list($this->_description, $this->_link) = $this->_explodeString16($this->_data, 2); $this->_description = $this->_convertString - (Transform::fromString16($this->_description), "utf-16"); + ($this->_description, "utf-16"); break; case self::UTF16BE: list($this->_description, $this->_link) = $this->_explodeString16($this->_data, 2); $this->_description = $this->_convertString - (Transform::fromString16BE($this->_description), "utf-16be"); + ($this->_description, "utf-16be"); break; case self::UTF8: list($this->_description, $this->_link) = @@ -165,15 +165,12 @@ final class ID3_Frame_WXXX extends ID3_Frame_AbstractLink { $data = Transform::toUInt8($this->_encoding); switch ($this->_encoding) { - case self::UTF16: case self::UTF16LE: - $data .= Transform::toString16 - ($this->_description, $this->_encoding == self::UTF16 ? - Transform::MACHINE_ENDIAN_ORDER : Transform::LITTLE_ENDIAN_ORDER) . - "\0\0"; + $data .= 0xfeff . $this->_description . "\0\0"; break; + case self::UTF16: case self::UTF16BE: - $data .= Transform::toString16BE($this->_description) . "\0\0"; + $data .= $this->_description . "\0\0"; break; default: $data .= $this->_description . "\0";