fossar / transcoder
PHP编码转换更佳
v2.0.0
2023-03-07 15:33 UTC
Requires
- php: >=7.2.5
Requires (Dev)
- symfony/phpunit-bridge: ^6.2
Suggests
- ext-iconv: For using the IconvTranscoder
- ext-mbstring: For using the MbTranscoder
Replaces
- ddeboer/transcoder: v2.0.0
This package is auto-updated.
Last update: 2024-09-08 15:54:13 UTC
README
介绍
这是一个围绕PHP的mb_convert_encoding
和iconv
函数的包装器。此库添加了以下功能:
- 对于它不支持的编码从
mb
到iconv
的回退 - 将警告转换为适当的异常。
安装
推荐通过Composer安装Transcoder库
$ composer require fossar/transcoder
此命令要求您全局安装Composer,如Composer文档中的安装章节中所述。
使用方法
基础
为您的平台创建正确的转换器并将字符串转换为ISO-8859-1编码
use Ddeboer\Transcoder\Transcoder; $transcoder = Transcoder::create(); $result = $transcoder->transcode('España', 'iso-8859-1');
您也可以手动实例化一个喜欢的转换器
use Ddeboer\Transcoder\MbTranscoder; $transcoder = new MbTranscoder();
或者
use Ddeboer\Transcoder\IconvTranscoder; $transcoder = new IconvTranscoder();
源编码
第二个参数接受源编码,实际上可以省略或传递null
。
$transcoder->transcode('España');
然而,在这种情况下,行为是后端特定的
IconvTranscoder
将使用进程的当前区域设置的编码。MbTranscoder
将尝试根据mbstring.language
设置值从列表中检测编码。默认情况下,它尝试ASCII,然后是UTF-8。但是,支持的语言数量有限,编码表通常重叠,因此检测可能不可靠。
如您所见,这对于西方语言来说大多是无用的。当您明确指定源编码时,您将获得更可靠的结果。
目标编码
将默认目标编码指定为create()
的第一个参数
use Ddeboer\Transcoder\Transcoder; $isoTranscoder = Transcoder::create('iso-8859-1');
或者,在transcode()
调用中指定目标编码作为第三个参数
use Ddeboer\Transcoder\Transcoder; $transcoder->transcode('España', 'iso-8859-1', 'UTF-8');
错误处理
PHP的mv_convert_encoding
和iconv
使用不便,因为它们生成通知和警告而不是适当的异常。此库修复了这个问题
use Ddeboer\Transcoder\Exception\UndetectableEncodingException; use Ddeboer\Transcoder\Exception\UnsupportedEncodingException; use Ddeboer\Transcoder\Exception\IllegalCharacterException; $input = 'España'; try { $transcoder->transcode($input, 'utf-8', 'not-a-real-encoding'); } catch (UnsupportedEncodingException $e) { // ‘not-a-real-encoding’ is an unsupported encoding } try { $transcoder->transcode('Illegal quotes: ‘ ’', 'utf-8', 'iso-8859-1'); } catch (IllegalCharacterException $e) { // Curly quotes ‘ ’ are illegal in ISO-8859-1 } try { $transcoder->transcode($input); } catch (UndetectableEncodingException $e) { // Failed to automatically detect $input’s encoding (mb) or not a valid string in current locale locale (iconv) }
转换器回退
通常,mb_convert_encoding
比iconv
快。然而,由于iconv
支持的编码比mb_convert_encoding
多,因此结合两者是有意义的。
因此,从create()
返回的转换器