2016-10-05 3 views
0

XML 파일을 Latin1에서 UTF-8로 변환하려고합니다. 몇 가지 테스트를 해봤지만 성공하지 못했습니다. 나는XML latin1을 UTF-8로 변환하고 다른 방법으로

Get-Content C:\inputfile.xml | Set-Content -Encoding utf8 C:\outputfile.xml 

을 사용하고 있습니다 그러나 이것은 아무것도 변환되지 않습니다. 그래서 Get-Content에서 인코딩을 시도했지만 Latin1이 PowerShell에서 인식되지 않습니다 (또는 그게 오류 메시지가 말하는 것입니다). 이것을 얻는 가장 좋은 방법은 무엇입니까?

답변

2

특히 큰 XML 파일의 경우 가장 빠른 방법은 .NET System.IO.File 클래스를 사용하는 것입니다. 명시 적으로 제공하는 Latin-1 인코딩

  • 사용 ReadAllText :

    [IO.File]::ReadAllText('r:\1.txt', [Text.Encoding]::GetEncoding('iso-8859-1')) | 
        Set-Content r:\2.txt -Encoding UTF8 
    
  • XML 파일이 필요한 <?xml version="1.0" encoding="iso-8859-1" ?>이있는 경우

    도 변경할 수 :

    [IO.File]::ReadAllText('r:\1.txt', [Text.Encoding]::GetEncoding('iso-8859-1')). 
        Replace('<?xml version="1.0" encoding="iso-8859-1"', 
          '<?xml version="1.0" encoding="UTF-8"') | 
        Set-Content r:\2.txt -Encoding UTF8 
    
  • 하는 라틴어 작성하려면 1 인코딩은 명시 적으로 제공되는 Latin-1 인코딩을 사용하여 WriteAllText을 사용합니다.

    [IO.File]::WriteAllText(
        'r:\2.txt', 
        [IO.File]::ReadAllText('r:\1.txt', [Text.Encoding]::UTF8). 
         Replace('<?xml version="1.0" encoding="UTF-8"', 
           '<?xml version="1.0" encoding="iso-8859-1"'), 
        [Text.Encoding]::GetEncoding('iso-8859-1') 
    ) 
    
  • 모든 크기의 파일을 처리 할 수있는 메모리 효율적인 트랜스 코딩 (1TB? 문제 없음) :!

    function transcodeXML(
        [ValidateScript({Test-Path -Literal $_})] 
        [string]$source, 
        [ValidateSet('IBM037', 'IBM437', 'IBM500', 'ASMO-708', 'DOS-720', 'ibm737', 'ibm775', 'ibm850', 'ibm852', 'IBM855', 'ibm857', 'IBM00858', 'IBM860', 'ibm861', 'DOS-862', 'IBM863', 'IBM864', 'IBM865', 'cp866', 'ibm869', 'IBM870', 'windows-874', 'cp875', 'shift_jis', 'gb2312', 'ks_c_5601-1987', 'big5', 'IBM1026', 'IBM01047', 'IBM01140', 'IBM01141', 'IBM01142', 'IBM01143', 'IBM01144', 'IBM01145', 'IBM01146', 'IBM01147', 'IBM01148', 'IBM01149', 'utf-16', 'utf-16BE', 'windows-1250', 'windows-1251', 'Windows-1252', 'windows-1253', 'windows-1254', 'windows-1255', 'windows-1256', 'windows-1257', 'windows-1258', 'Johab', 'macintosh', 'x-mac-japanese', 'x-mac-chinesetrad', 'x-mac-korean', 'x-mac-arabic', 'x-mac-hebrew', 'x-mac-greek', 'x-mac-cyrillic', 'x-mac-chinesesimp', 'x-mac-romanian', 'x-mac-ukrainian', 'x-mac-thai', 'x-mac-ce', 'x-mac-icelandic', 'x-mac-turkish', 'x-mac-croatian', 'utf-32', 'utf-32BE', 'x-Chinese-CNS', 'x-cp20001', 'x-Chinese-Eten', 'x-cp20003', 'x-cp20004', 'x-cp20005', 'x-IA5', 'x-IA5-German', 'x-IA5-Swedish', 'x-IA5-Norwegian', 'us-ascii', 'x-cp20261', 'x-cp20269', 'IBM273', 'IBM277', 'IBM278', 'IBM280', 'IBM284', 'IBM285', 'IBM290', 'IBM297', 'IBM420', 'IBM423', 'IBM424', 'x-EBCDIC-KoreanExtended', 'IBM-Thai', 'koi8-r', 'IBM871', 'IBM880', 'IBM905', 'IBM00924', 'EUC-JP', 'x-cp20936', 'x-cp20949', 'cp1025', 'koi8-u', 'iso-8859-1', 'iso-8859-2', 'iso-8859-3', 'iso-8859-4', 'iso-8859-5', 'iso-8859-6', 'iso-8859-7', 'iso-8859-8', 'iso-8859-9', 'iso-8859-13', 'iso-8859-15', 'x-Europa', 'iso-8859-8-i', 'iso-2022-jp', 'csISO2022JP', 'iso-2022-jp', 'iso-2022-kr', 'x-cp50227', 'euc-jp', 'EUC-CN', 'euc-kr', 'hz-gb-2312', 'GB18030', 'x-iscii-de', 'x-iscii-be', 'x-iscii-ta', 'x-iscii-te', 'x-iscii-as', 'x-iscii-or', 'x-iscii-ka', 'x-iscii-ma', 'x-iscii-gu', 'x-iscii-pa', 'utf-7', 'utf-8')] 
        [string]$sourceEncoding, 
    
        [ValidateScript({Test-Path -Literal $_ -IsValid})] 
        [string]$target, 
        [ValidateSet('IBM037', 'IBM437', 'IBM500', 'ASMO-708', 'DOS-720', 'ibm737', 'ibm775', 'ibm850', 'ibm852', 'IBM855', 'ibm857', 'IBM00858', 'IBM860', 'ibm861', 'DOS-862', 'IBM863', 'IBM864', 'IBM865', 'cp866', 'ibm869', 'IBM870', 'windows-874', 'cp875', 'shift_jis', 'gb2312', 'ks_c_5601-1987', 'big5', 'IBM1026', 'IBM01047', 'IBM01140', 'IBM01141', 'IBM01142', 'IBM01143', 'IBM01144', 'IBM01145', 'IBM01146', 'IBM01147', 'IBM01148', 'IBM01149', 'utf-16', 'utf-16BE', 'windows-1250', 'windows-1251', 'Windows-1252', 'windows-1253', 'windows-1254', 'windows-1255', 'windows-1256', 'windows-1257', 'windows-1258', 'Johab', 'macintosh', 'x-mac-japanese', 'x-mac-chinesetrad', 'x-mac-korean', 'x-mac-arabic', 'x-mac-hebrew', 'x-mac-greek', 'x-mac-cyrillic', 'x-mac-chinesesimp', 'x-mac-romanian', 'x-mac-ukrainian', 'x-mac-thai', 'x-mac-ce', 'x-mac-icelandic', 'x-mac-turkish', 'x-mac-croatian', 'utf-32', 'utf-32BE', 'x-Chinese-CNS', 'x-cp20001', 'x-Chinese-Eten', 'x-cp20003', 'x-cp20004', 'x-cp20005', 'x-IA5', 'x-IA5-German', 'x-IA5-Swedish', 'x-IA5-Norwegian', 'us-ascii', 'x-cp20261', 'x-cp20269', 'IBM273', 'IBM277', 'IBM278', 'IBM280', 'IBM284', 'IBM285', 'IBM290', 'IBM297', 'IBM420', 'IBM423', 'IBM424', 'x-EBCDIC-KoreanExtended', 'IBM-Thai', 'koi8-r', 'IBM871', 'IBM880', 'IBM905', 'IBM00924', 'EUC-JP', 'x-cp20936', 'x-cp20949', 'cp1025', 'koi8-u', 'iso-8859-1', 'iso-8859-2', 'iso-8859-3', 'iso-8859-4', 'iso-8859-5', 'iso-8859-6', 'iso-8859-7', 'iso-8859-8', 'iso-8859-9', 'iso-8859-13', 'iso-8859-15', 'x-Europa', 'iso-8859-8-i', 'iso-2022-jp', 'csISO2022JP', 'iso-2022-jp', 'iso-2022-kr', 'x-cp50227', 'euc-jp', 'EUC-CN', 'euc-kr', 'hz-gb-2312', 'GB18030', 'x-iscii-de', 'x-iscii-be', 'x-iscii-ta', 'x-iscii-te', 'x-iscii-as', 'x-iscii-or', 'x-iscii-ka', 'x-iscii-ma', 'x-iscii-gu', 'x-iscii-pa', 'utf-7', 'utf-8')] 
        [string]$targetEncoding 
    ) { 
        $reader = [IO.StreamReader]::new(
         $source, 
         [Text.Encoding]::GetEncoding($sourceEncoding) 
        ) 
        $writer = [IO.StreamWriter]::new(
         $target, 
         $false, # don't append = overwrite 
         [Text.Encoding]::GetEncoding($targetEncoding) 
        ) 
        $buf = [char[]]::new(16MB) 
    
        $nRead = $reader.Read($buf, 0, $buf.Length) 
        $writer.Write(
         ([regex]"(<\?xml [^>]*?encoding="")(?i)$sourceEncoding(?="")").Replace(
          [string]::new($buf, 0, $nRead), 
          '$1' + $targetEncoding, 
          1 # speedup: one replacement only 
         ) 
        ) 
        while (!$reader.EndOfStream) { 
         $nRead = $reader.Read($buf, 0, $buf.Length) 
         $writer.Write($buf, 0, $nRead) 
        } 
        $reader.Close() 
        $writer.Close() 
    } 
    

    사용법 :

    transcodeXML 'r:\1.xml' iso-8859-1 'r:\2.xml' utf-8 
    
+0

예, _please_는 XML 선언의 인코딩을 거짓으로 보지 않습니다. 두 번째 총알이 중요합니다. –

+0

이러한 기술은 또한 XML 의미가 중요하지 않다고 여겨지는 인간의 가치있는 공백을 보존합니다. –

관련 문제