如何读取 php 包装器中的文件作为 utf-16

How To Read A File in php wrappers as utf-16

有没有办法使用 PHP 的流包装器以特定字符编码(如 UTF-16)读取文件,就像我可以使用 [=11= 读取 base64 编码的文件一样]?

PHP 字符串对编码一无所知,因此 PHP 文件函数实质上将每个文件都视为二进制文件。

如果您知道一组字节应该被读取为 UTF-16,您可以将它 转换为 您选择的其他编码(这里使用 UTF-8 作为示例)使用其中任何一个(取决于您安装的扩展):

// Requires ext/iconv; arguments are From, To, String
$utf8_string = iconv('UTF-16', 'UTF-8', $utf16_string);
// Requires ext/mbstring; arguments are String, To, From
$utf8_string = mb_convert_encoding($utf16_string, 'UTF-8', 'UTF-16');
// Requires ext/intl; arguments are String, To, From
$utf8_string = UConverter::transcode($utf16_string, 'UTF-8', 'UTF-16');

相反,如果您知道该字符串采用某种特定编码(再次以 UTF-8 为例),并且希望它是 UTF-16,您会以相反的顺序排列:

// Requires ext/iconv; arguments are From, To, String
$utf16_string = iconv('UTF-8', 'UTF-16', $utf8_string);
// Requires ext/mbstring; arguments are String, To, From
$utf16_string = mb_convert_encoding($utf8_string, 'UTF-16', 'UTF-8');
// Requires ext/intl; arguments are String, To, From
$utf16_string = UConverter::transcode($utf8_string, 'UTF-16', 'UTF-8');

在这两种情况下,生成的字符串只是不同的字节序列;其他 PHP 功能仍然不会“知道”它的“含义”。


“iconv”扩展还提供 a conversion filter,它在读取文件或流时运行与 iconv 功能等效的功能。因此,如果您有一个您知道应该以 UTF-16 格式读取的文件,并希望其内容以 UTF-8 格式读取,您可以这样写:

$fp = fopen('php://filter/convert.iconv.utf-16.utf-8/resource=/path/to/utf16-file.txt', 'r');
$first_10_bytes_of_utf16_converted_to_utf8 = fgets($fp, 10);
fclose($fp);

或相反 - 一个 UTF-8 文件,您希望将其读取为 UTF-16:

$fp = fopen('php://filter/convert.iconv.utf-8.utf-16/resource=/path/to/utf8-file.txt', 'r');
$first_10_bytes_of_utf8_converted_to_utf16 = fgets($fp, 10);
fclose($fp);

同样,重要的是要记住 PHP 在 字节中工作 ,因此上面的 fgets 调用可能会导致文本损坏,因为第 10 个字节不是 Unicode 代码点的结尾。