Convert &#xxxx; to normal character?
<p>lxml.etree.parse() have generate string in utf-16 file as &amp;#xxxx; How can I convert it back?</p>

<p>Opening output file in web browser is fine. However I still need regular string in output file, too.</p>

<p>Example file:</p>

<pre><code>&lt;?xml version="1.0" encoding="UTF-16"?&gt;
&lt;?xml-stylesheet type="text/xsl" href="xxx.xsl"?&gt;
&lt;TEI.2&gt;
&lt;teiHeader&gt;&lt;/teiHeader&gt;
&lt;text&gt;
&lt;front&gt;&lt;/front&gt;
&lt;body&gt;
&lt;p rend="chapter"&gt;à¸­à¸à¸´à¸à¸£à¸à¸à¸à¸ºà¸à¸¢à¸à¸à¸²à¸§à¸à¸ºà¸à¸à¸²&lt;/p&gt;

&lt;p rend="bodytext" n="285"&gt;&lt;hi rend="paranum"&gt;à¹à¹à¹&lt;/hi&gt;&lt;hi rend="dot"&gt;.&lt;/hi&gt; &lt;hi rend="bold"&gt;à¸§à¸´à¸§à¸²à¸à¸²à¸à¸´à¸à¸£à¸à¸¡à¸ºà¸«à¸²&lt;/hi&gt;à¸à¸´ ââà¸­à¸à¸¡à¸ºà¸¡à¹ âà¸à¹à¸¡à¸ºà¸¡âà¸à¸´ à¸à¸µà¹à¸à¸à¸µââà¸à¸´à¸­à¸²à¸à¸´à¸à¸¢à¸à¸ºà¸à¸§à¸à¸ºà¸à¸² à¸­à¸à¸ºà¸à¸²à¸£à¸ªà¹à¸ à¸à¸à¸£à¸§à¸à¸ºà¸à¸¸à¸à¸´à¸ªà¸ºà¸ªà¸´à¸à¸² à¸§à¸´à¸§à¸²à¸à¸²à¸à¸´à¸à¸£à¸à¸¡à¸ºà¸«à¸²à¸¯&lt;/p&gt;
&lt;/body&gt;
&lt;back&gt;&lt;/back&gt;
&lt;/text&gt;
&lt;/TEI.2&gt;
</code></pre>

<p>Code:</p>

<pre><code>#coding:utf8
import lxml.etree as ET

xml_filename="example.xml"
dom = ET.parse(xml_filename)
print ET.tostring(dom, pretty_print=True))
</code></pre>

<p>Example output:</p>

<pre><code>&lt;?xml-stylesheet type="text/xsl" href="xxx.xsl"?&gt;&lt;TEI.2&gt;
&lt;teiHeader/&gt;
&lt;text&gt;
&lt;front/&gt;
&lt;body&gt;
&lt;p rend="chapter"&gt;&amp;#3607;&amp;#3640;&amp;#3585;&amp;#3617;&amp;#3634;&amp;#3605;&amp;#3636;&amp;#3585;&amp;#3634;&amp;#3611;&amp;#3607;&amp;#3623;&amp;#3603;&amp;#3642;&amp;#3603;&amp;#3609;&amp;#3634;&lt;/p&gt;
&lt;/body&gt;
&lt;back/&gt;
&lt;/text&gt;
&lt;/TEI.2&gt;
</code></pre>

<p>You need to specify the encoding when you use <em>tostring</em>:</p>

<pre><code>dIn [2]: !cat  "test.xml"
ï¿½ï¿½&lt;?xml version="1.0" encoding="UTF-16"?&gt;
&lt;?xml-stylesheet type="text/xsl" href="xxx.xsl"?&gt;
&lt;TEI.2&gt;
    &lt;teiHeader&gt;&lt;/teiHeader&gt;
    &lt;text&gt;
        &lt;front&gt;&lt;/front&gt;
        &lt;body&gt;
            &lt;p rend="chapter"&gt;-4#"2':2&lt;/p&gt;

            &lt;p rend="bodytext" n="285"&gt;&lt;hi rend="paranum"&gt;RXU&lt;/hi&gt;&lt;hi rend="dot"&gt;.&lt;/hi&gt; &lt;hi rend="bold"&gt;'4'224#!:+2&lt;/hi&gt;4   -!:!M  B!:! 4 5@5  4-24":':2 -:2#*@ #':84*:*42 '4'224#!:+2/&lt;/p&gt;
        &lt;/body&gt;
        &lt;back&gt;&lt;/back&gt;
    &lt;/text&gt;
&lt;/TEI.2&gt;

In [3]: import lxml.etree as ET

In [4]: xml_filename = "test.xml"

In [5]: dom = ET.parse(xml_filename)
</code></pre>

<p><em>utf-16:</em></p>

<pre><code>In [6]: print ET.tostring(dom, pretty_print=True, encoding="utf-16")
ï¿½ï¿½&lt;?xml version='1.0' encoding='utf-16'?&gt;
&lt;?xml-stylesheet type="text/xsl" href="xxx.xsl"?&gt;
&lt;TEI.2&gt;
    &lt;teiHeader/&gt;
    &lt;text&gt;
        &lt;front/&gt;
        &lt;body&gt;
            &lt;p rend="chapter"&gt;-4#"2':2&lt;/p&gt;

            &lt;p rend="bodytext" n="285"&gt;&lt;hi rend="paranum"&gt;RXU&lt;/hi&gt;&lt;hi rend="dot"&gt;.&lt;/hi&gt; &lt;hi rend="bold"&gt;'4'224#!:+2&lt;/hi&gt;4   -!:!M  B!:! 4 5@5  4-24":':2 -:2#*@ #':84*:*42 '4'224#!:+2/&lt;/p&gt;
        &lt;/body&gt;
        &lt;back/&gt;
    &lt;/text&gt;
&lt;/TEI.2&gt;
</code></pre>

<p><em>utf-8:</em></p>

<pre><code>In [7]: print ET.tostring(dom, pretty_print=True, encoding="utf-8")
&lt;?xml-stylesheet type="text/xsl" href="xxx.xsl"?&gt;
&lt;TEI.2&gt;
    &lt;teiHeader/&gt;
    &lt;text&gt;
        &lt;front/&gt;
        &lt;body&gt;
            &lt;p rend="chapter"&gt;à¸­à¸à¸´à¸à¸£à¸à¸à¸à¸ºà¸à¸¢à¸à¸à¸²à¸§à¸à¸ºà¸à¸à¸²&lt;/p&gt;

            &lt;p rend="bodytext" n="285"&gt;&lt;hi rend="paranum"&gt;à¹à¹à¹&lt;/hi&gt;&lt;hi rend="dot"&gt;.&lt;/hi&gt; &lt;hi rend="bold"&gt;à¸§à¸´à¸§à¸²à¸à¸²à¸à¸´à¸à¸£à¸à¸¡à¸ºà¸«à¸²&lt;/hi&gt;à¸à¸´ ââà¸­à¸à¸¡à¸ºà¸¡à¹ âà¸à¹à¸¡à¸ºà¸¡âà¸à¸´ à¸à¸µà¹à¸à¸à¸µââà¸à¸´à¸­à¸²à¸à¸´à¸à¸¢à¸à¸ºà¸à¸§à¸à¸ºà¸à¸² à¸­à¸à¸ºà¸à¸²à¸£à¸ªà¹à¸ à¸à¸à¸£à¸§à¸à¸ºà¸à¸¸à¸à¸´à¸ªà¸ºà¸ªà¸´à¸à¸² à¸§à¸´à¸§à¸²à¸à¸²à¸à¸´à¸à¸£à¸à¸¡à¸ºà¸«à¸²à¸¯&lt;/p&gt;
        &lt;/body&gt;
        &lt;back/&gt;
    &lt;/text&gt;
&lt;/TEI.2&gt;
</code></pre>

<p><em>ascii(default)</em>:</p>

<pre><code>In [8]: print ET.tostring(dom, pretty_print=True, encoding="ascii")
&lt;?xml-stylesheet type="text/xsl" href="xxx.xsl"?&gt;
&lt;TEI.2&gt;
    &lt;teiHeader/&gt;
    &lt;text&gt;
        &lt;front/&gt;
        &lt;body&gt;
            &lt;p rend="chapter"&gt;&amp;#3629;&amp;#3608;&amp;#3636;&amp;#3585;&amp;#3619;&amp;#3603;&amp;#3611;&amp;#3592;&amp;#3642;&amp;#3592;&amp;#3618;&amp;#3585;&amp;#3606;&amp;#3634;&amp;#3623;&amp;#3603;&amp;#3642;&amp;#3603;&amp;#3609;&amp;#3634;&lt;/p&gt;

            &lt;p rend="bodytext" n="285"&gt;&lt;hi rend="paranum"&gt;&amp;#3666;&amp;#3672;&amp;#3669;&lt;/hi&gt;&lt;hi rend="dot"&gt;.&lt;/hi&gt; &lt;hi rend="bold"&gt;&amp;#3623;&amp;#3636;&amp;#3623;&amp;#3634;&amp;#3607;&amp;#3634;&amp;#3608;&amp;#3636;&amp;#3585;&amp;#3619;&amp;#3603;&amp;#3617;&amp;#3642;&amp;#3627;&amp;#3634;&lt;/hi&gt;&amp;#3605;&amp;#3636; &amp;#8216;&amp;#8216;&amp;#3629;&amp;#3608;&amp;#3617;&amp;#3642;&amp;#3617;&amp;#3661; &amp;#8216;&amp;#3608;&amp;#3650;&amp;#3617;&amp;#3642;&amp;#3617;&amp;#8217;&amp;#3605;&amp;#3636; &amp;#3607;&amp;#3637;&amp;#3648;&amp;#3611;&amp;#3605;&amp;#3637;&amp;#8217;&amp;#8217;&amp;#3605;&amp;#3636;&amp;#3629;&amp;#3634;&amp;#3607;&amp;#3636;&amp;#3609;&amp;#3618;&amp;#3611;&amp;#3642;&amp;#3611;&amp;#3623;&amp;#3605;&amp;#3642;&amp;#3605;&amp;#3634; &amp;#3629;&amp;#3598;&amp;#3642;&amp;#3600;&amp;#3634;&amp;#3619;&amp;#3626;&amp;#3648;&amp;#3616;&amp;#3607;&amp;#3585;&amp;#3619;&amp;#3623;&amp;#3605;&amp;#3642;&amp;#3606;&amp;#3640;&amp;#3609;&amp;#3636;&amp;#3626;&amp;#3642;&amp;#3626;&amp;#3636;&amp;#3605;&amp;#3634; &amp;#3623;&amp;#3636;&amp;#3623;&amp;#3634;&amp;#3607;&amp;#3634;&amp;#3608;&amp;#3636;&amp;#3585;&amp;#3619;&amp;#3603;&amp;#3617;&amp;#3642;&amp;#3627;&amp;#3634;&amp;#3631;&lt;/p&gt;
        &lt;/body&gt;
        &lt;back/&gt;
    &lt;/text&gt;
&lt;/TEI.2&gt;
</code></pre>

python html xml character-encoding lxml