Как записать данные UTF-8 в файл UTF-16LE с помощью PHP?

Учитывая строку данных UTF-8 в PHP, как я могу преобразовать и сохранить ее в файл 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);

person murdaugh    schedule 25.10.2013    source источник


Ответы (3)


Вы можете использовать iconv:

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

Обратите внимание, что UTF-16LE не включает маркер порядка байтов, поскольку порядок байтов четко определен. Для создания спецификации используйте вместо этого "UTF-16".

person Joni    schedule 25.10.2013
comment
Файл, созданный этим (без спецификации), сам по себе не открывался в InDesign (он не определял его как файл UTF-16LE), но я нашел решение, упаковав спецификацию UTF-16LE, изменив порядок байтов и с предложенным вами значком. Спасибо. - person murdaugh; 26.10.2013

Используя следующий код, я нашел решение:

эта функция изменяет порядок байтов (от 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));
person murdaugh    schedule 26.10.2013

В качестве альтернативы вы можете использовать mb_convert_encoding() следующим образом:

$copy_UTF16LE = mb_convert_encoding($copy,'UTF-16LE','UTF-8');
person r3mainer    schedule 25.10.2013