Я экспортирую набор записей в xml, а затем в xliff посредством преобразования xslt. Экспорт работает нормально, но мне не удается преобразовать некоторые символы в экспортный файл. Вот здесь некоторые пошаговые детали:
Шаг 1. Пользователь вводит смешанную строку символов, например. следующая строка Autocomplete On' see the wrong character ==> í
Кодировка поля Mysql db/table установлена на utf8, например
`unicode longtext COLLATE utf8_unicode_ci`
который хранит приведенный выше текст.
Шаг 2. Фрагмент html создается для целей экспорта, например
<html version="1.2">
<table>
<tr>
<td id="Autocomplete_On">Autocomplete On' see the wrong character ==> í</td>
</tr>
</table>
</html>
Шаг 3. Преобразование в xml
<?xml version="1.0" standalone="yes"?>
<html version="1.2"><body><table><tr><td id="Autocomplete_On">
Autocomplete On' see the wrong character ==> í</td>
</tr></table></body></html>
Шаг 4: Преобразуйте с помощью xslt:
(вставил только желаемую часть вывода, при просмотре в браузере я вижу это, а фактический символ в файле Ã
)
<body>
<group id="id796986axmarkhtml-0">
<group id="id533787bxmarkbody-1">
<group id="id533788bxmarktable-2">
<group id="id533790bxmarktr-3">
<trans-unit id="td-4">
<source>Autocomplete On' see the wrong character ==> ÃÂ</source>
<target>Autocomplete On' see the wrong character ==> ÃÂ</target>
</trans-unit>
</group>
</group>
</group>
</group>
</body>
Фактический код:
private function xml2xliff($htmlStr,$source,$target){
$xml=new \DOMDocument();
//hacky way to tidy html
@$xml->loadHTML($htmlStr);//step 3
$xsl = new \DOMDocument;
$xsl->load(__DIR__.'/xliff/xsl/xml2xliff.xsl');
$proc = new \XSLTProcessor();
$proc->ImportStyleSheet($xsl);
$proc->setParameter('', 'source', $this->getIsoName($source));
$proc->setParameter('', 'target', $this->getIsoName($target));
return $proc->transformToXML($xml); //step 4
}
$htmlStr — фрагмент html, сгенерированный на шаге 2,
Итак, проблема в том, что строка дважды преобразуется. Фактический рассматриваемый персонаж
шаг 1. í
шаг 2. еще í
шаг 3. конвертируется в à т.е. í
шаг 4. преобразовано в ÃÂ
Другой пример:
вход. Autocomplete On They’re gone now
вывод xml. Autocomplete On Theyâre gone now