Выходной файл в PHP, закодированный как OCS-2 Big Endian

Как я могу написать файл на PHP с кодировкой OCS-2 Big Endian? Промышленная система, с которой я пытаюсь интегрироваться, требует этого формата кодирования.

Чтобы упростить проблему, предположим, что содержимое, которое я пытался записать в файл, было сохранено в переменной $sXML, в этом случае содержимое XML с кодировкой, установленной в заголовке XML, готово:

$sXML = '<?xml version="1.0" encoding="utf-16BE"?>';
$sXML .= '<envelope><node>1</node><node>2</node><node>3</node></envelope>';
/* Insert solution here */
file_put_contents( 'filename.xml', $sXML );

До сих пор я пробовал, например:

  1. $sXML = iconv( '', 'UCS-2BE', $sXML );
  2. $sXML = html_entity_decode( htmlentities( $sXML, ENT_QUOTES, 'Windows-1252' ), ENT_QUOTES, 'UCS-2BE' );
  3. $sXML = mb_convert_encoding( $sXML, 'UCS-2BE', 'HTML-ENTITIES' );

И хотя все это портит удобочитаемость файла, сгенерированного в Notepad++, ни одно из них не приводит к установке кодировки файла в UCS-2BE.

Если вы не знакомы с кодировкой OCS-2 с обратным порядком байтов, это может оказаться важным/полезным чтением: Более подробное объяснение (блог): понимание порядка следования байтов в обратном и обратном порядке.

Я пытался просмотреть другие вопросы здесь, в StackOverflow, но нашел решение этой конкретной проблемы или сумел адаптировать к этому любые другие. Любая помощь могла бы быть полезна! Спасибо.


person richhallstoke    schedule 08.05.2015    source источник
comment
это PHP или вывод, который должен быть UCS-2 Big Endian?   -  person Bob Nocraz    schedule 08.05.2015
comment
Это вывод - $sXML. Для меня не имеет никакого значения, получу ли я вывод через file_put_contents, эхо или любой другой метод, просто мне нужно с правильной кодировкой! Спасибо.   -  person richhallstoke    schedule 08.05.2015
comment
Вы пробовали использовать simplexml?   -  person Bob Nocraz    schedule 10.05.2015
comment
Конечно, я могу использовать функции simplexml для генерации/анализа XML, но я просто пытался привести очень простой пример, поскольку здесь проблема заключается в кодировке UCS-2BE, содержимое файла на самом деле не имеет значения. Это могут быть любые текстовые или двоичные данные, и у меня все равно будет та же проблема. Big Endian предполагает запись байтов в другой группировке и порядке.   -  person richhallstoke    schedule 11.05.2015
comment
ну, я просто подумал, что в отношении XML вы можете использовать его встроенные функции для сохранения в файл. Я извиняюсь, что не прочитал достаточно, чтобы увидеть, что вы будете сохранять больше, чем просто XML   -  person Bob Nocraz    schedule 11.05.2015


Ответы (1)


Как оказалось, я был очень близок к этому, и в конце концов у меня получилось. Проверенный рабочий раствор выглядит следующим образом:

$sXML = pack( 'n', 0xFEFF ) . iconv( '', 'UCS-2BE', $sXML );

Спасибо всем за помощь в устранении этой проблемы.

person richhallstoke    schedule 12.05.2015