2013-10-25 2 views
0

С учетом строки данных UTF-8 в PHP, как я могу преобразовать и сохранить ее в файл UTF-16LE (этот конкретный файл будет предназначен для Indesign), который будет помещен как помеченный текстовый документ).Как написать данные UTF-8 в файл UTF-16LE с помощью PHP?

данных:

$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); 

ответ

0

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

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

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

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

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

+0

Файл, созданный этим (без спецификации), не будет открыт в InDesign (он не обнаружил его как файл UTF-16LE), но я нашел решение, упаковав спецификацию UTF-16LE, байтовый заказ _and_ со значком, который вы предложили. Благодарю. – murdaugh

0

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

$copy_UTF16LE = mb_convert_encoding($copy,'UTF-16LE','UTF-8');