¿Cuál es la forma más fácil de convertir XML a partir de UTF16 a un archivo codificado en UTF8?

3 Comentarios

  1. 14

    Esto puede no ser la más óptima, pero funciona. Simplemente carga el xml y empujar de nuevo a un archivo. la cabecera de xml se pierde, sin embargo, esto tiene que ser re-añadió.

    $files = get-ChildItem "*.xml"
    foreach ( $file in $files )
    {
        [System.Xml.XmlDocument]$doc = new-object System.Xml.XmlDocument;
        $doc.set_PreserveWhiteSpace( $true );
        $doc.Load( $file );
    
        $root = $doc.get_DocumentElement();
        $xml = $root.get_outerXml();
        $xml = '<?xml version="1.0" encoding="utf-8"?>' + $xml
    
        $newFile = $file.Name + ".new"
        Set-Content -Encoding UTF8 $newFile $xml;
    }
    • No se establece explícitamente la codificación de guardar en algún lugar?
    • Si supiera cómo, yo lo haría. Parece ser que el defecto, aunque.
    • -Parámetro de codificación.
    • Gracias. Se que el trabajo regular de HTML?
    • Hadron: no, a menos que sea XML válido también.
  2. 14

    Bueno, supongo que la manera más fácil es que no le importa si el archivo es XML o no y simplemente convertir:

    Get-Content file.foo -Encoding Unicode | Set-Content -Encoding UTF8 newfile.foo

    Esto sólo funcionará para XML cuando no hay

    <?xml version="1.0" encoding="UTF-16"?>

    línea.

    • Si quieres hacerlo sin crear un nuevo archivo, se puede envolver el contenido entre paréntesis: (Get-Archivo de Contenido.foo) | Serie-Content-Encoding UTF8 Archivo.foo
    • ¿Cómo hacer esto para los archivos en un directorio y los subdirectorios?
    • gci -rec -fi * | %{(gc $_ -enc unicode) | set-content -enc utf8 $_.fullname}. Bastante sencillo, en realidad.
    • una pequeña corrección en su secuencia de comandos de powershell… gci -rec -fi * | %{(gc $_.fullname -enc unicode) | set-content -enc utf8 $_.fullname}
    • No hay necesidad de utilizar FullName allí. Get-Content sabe cómo lidiar con un FileInfo.
    • por desgracia para mí fue quejándose de que no podía encontrar el camino. Creo que se debe convertir el objeto FileInfo para una cadena. Get-Content : Cannot find path 'C:\WorkingFolder\FileName.txt' because it does not exist. At line:1 char:26 + gci -rec -fi *.txt | %{(gc <<<< $_ -enc ascii) | set-content -enc utf8 $_.fullname} + CategoryInfo : ObjectNotFound: (C:\WorkingFolder\FileName.txt:String) [Get-Content], ItemNotFoundException + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetContentCommand FileName.txt fue en una subcarpeta de C:\WorkingFolder.

  3. 9

    De probar esta solución que utiliza un XmlWriter:

    $encoding="UTF-8" # most encoding should work
    $files = get-ChildItem "*.xml"
    foreach ( $file in $files )
    {
        [xml] $xmlDoc = get-content $file
        $xmlDoc.xml = $($xmlDoc.CreateXmlDeclaration("1.0",$encoding,"")).Value
        $xmlDoc.save($file.FullName)      
    }

    Usted puede desear mirar en XMLDocument para más explicación sobre CreateXmlDeclaration.

    • Muchas gracias por cuidar a proporcionar un resumen, técnicamente mejor, la respuesta a tal pregunta!
    • Tuve que hacerlo y me encontré con esta solución, incluso antes de ver a esta pregunta. Sentí que era normal para ofrecer. Con poco esfuerzo, alguien puede incluso utilizarlo para copiar mientras que la conversión de la codificación de los archivos. Saludos.

Dejar respuesta

Please enter your comment!
Please enter your name here