0

给定 PHP 中的一串 UTF-8 数据,我如何将其转换并保存为 UTF-16LE 文件(这个特定文件恰好是为 Indesign 设计的 - 被放置为标记的文本文档)。

数据:

$copy = "<UNICODE-MAC>\n";
$copy .= "<Version:8><FeatureSet:InDesign-Roman><ColorTable:=<Black:COLOR:CMYK:Process:0,0,0,1>>\n";
$copy .= "A bunch of unicode special characters like ñ, é, etc.";

我正在使用以下代码,但无济于事:

file_put_contents("output.txt", pack("S",0xfeff) . $copy);
4

3 回答 3

3

您可以使用iconv

$copy_utf16 = iconv("UTF-8", "UTF-16LE", $copy);
file_put_contents("output.txt", $copy_utf16);

请注意,UTF-16LE 不包括 Byte-Order-Marker,因为字节顺序定义明确。要生成 BOM ,请"UTF-16"改为使用。

于 2013-10-25T15:18:00.580 回答
1

使用以下代码,我找到了解决方案:

此函数更改字节顺序(来自http://shiplu.mokadd.im/95/convert-little-endian-to-big-endian-in-php-or-vice-versa/):

function chbo($num) {
    $data = dechex($num);
    if (strlen($data) <= 2) {
        return $num;
    }
    $u = unpack("H*", strrev(pack("H*", $data)));
    $f = hexdec($u[1]);
    return $f;
}

与 utf-8 到 utf-16LE 转换一起使用,它会创建一个可与 indesign 一起使用的文件:

file_put_contents("output.txt", pack("S",0xfeff). chbo(iconv("UTF-8","UTF-16LE",$copy));
于 2013-10-26T13:16:40.657 回答
0

或者,您可以mb_convert_encoding()按如下方式使用:

$copy_UTF16LE = mb_convert_encoding($copy,'UTF-16LE','UTF-8');
于 2013-10-25T15:22:00.520 回答