fossar/transcoder

PHP编码转换更佳

v2.0.0 2023-03-07 15:33 UTC

This package is auto-updated.

Last update: 2024-09-08 15:54:13 UTC


README

Packagist Version

介绍

这是一个围绕PHP的mb_convert_encodingiconv函数的包装器。此库添加了以下功能:

  • 对于它不支持的编码从mbiconv的回退
  • 将警告转换为适当的异常。

安装

推荐通过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_encodingiconv使用不便,因为它们生成通知和警告而不是适当的异常。此库修复了这个问题

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_encodingiconv快。然而,由于iconv支持的编码比mb_convert_encoding多,因此结合两者是有意义的。

因此,从create()返回的转换器

  • 如果安装了mbstring PHP扩展,则使用mb_convert_encoding
  • 如果没有,则如果安装了iconv扩展,则使用iconv
  • 如果mbstring和iconv扩展都可用,转换器将首先尝试mb_convert_encoding,然后回退到iconv