diff --git a/src/PhpZip/Stream/ZipInputStream.php b/src/PhpZip/Stream/ZipInputStream.php index 37dd6be..dea05de 100644 --- a/src/PhpZip/Stream/ZipInputStream.php +++ b/src/PhpZip/Stream/ZipInputStream.php @@ -311,7 +311,7 @@ class ZipInputStream implements ZipInputStreamInterface fread($this->in, 42) ); -// $utf8 = 0 !== ($data['gpbf'] & self::GPBF_UTF8); +// $utf8 = ($data['gpbf'] & ZipEntry::GPBF_UTF8) !== 0; // See appendix D of PKWARE's ZIP File Format Specification. $name = fread($this->in, $data['fileLength']); diff --git a/src/PhpZip/Util/StringUtil.php b/src/PhpZip/Util/StringUtil.php index 0b75040..b579eac 100644 --- a/src/PhpZip/Util/StringUtil.php +++ b/src/PhpZip/Util/StringUtil.php @@ -28,4 +28,29 @@ class StringUtil return $needle === "" || (($temp = strlen($haystack) - strlen($needle)) >= 0 && strpos($haystack, $needle, $temp) !== false); } + + /** + * @param string $str + * @return string + */ + public static function cp866toUtf8($str) + { + if (function_exists('iconv')) { + /** @noinspection PhpComposerExtensionStubsInspection */ + return iconv('CP866', 'UTF-8//IGNORE', $str); + } elseif (function_exists('mb_convert_encoding')) { + /** @noinspection PhpComposerExtensionStubsInspection */ + return mb_convert_encoding($str, 'UTF-8', 'CP866'); + } elseif (class_exists('UConverter')) { + /** @noinspection PhpComposerExtensionStubsInspection */ + $converter = new \UConverter('UTF-8', 'CP866'); + return $converter->convert($str, false); + } else { + static $cp866Utf8Pairs; + if (empty($cp866Utf8Pairs)) { + $cp866Utf8Pairs = require __DIR__ . '/encodings/cp866-utf8.php'; + } + return strtr($str, $cp866Utf8Pairs); + } + } } diff --git a/src/PhpZip/Util/encodings/cp866-utf8.php b/src/PhpZip/Util/encodings/cp866-utf8.php new file mode 100644 index 0000000..b61d753 Binary files /dev/null and b/src/PhpZip/Util/encodings/cp866-utf8.php differ