一連のレコードを xml にエクスポートしてから、xslt 変換を介して xliff にエクスポートしています。エクスポートは正常に機能しますが、エクスポート ファイルの一部の文字を変換できません。ここにいくつかのステップバイステップの詳細があります:
ステップ 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 はステップ 2 で生成された HTML スニペットです。
問題は、文字列が 2 回変換されることです。検討中の実際のキャラクターは
ステップ1。í
ステップ 2. まだí
ステップ 3. √ie に変換 í
ステップ 4. に変換ÃÂ
もう一つの例:
入力。Autocomplete On They’re gone now
xml 出力。Autocomplete On Theyâre gone now