2011-11-10 71 views
0

我試圖將perl腳本轉換爲powershell腳本。當腳本正在讀取日誌文件並且必須獲取文件的編碼時,我遇到了一部分問題。獲取從文件中讀取的字符串編碼

下面是Perl代碼:

sub get_encoding { 
my $f = shift; 
my $fh; 
return "ASCII" if (!open ($fh,"<",$f)); 
my $b = ""; 
my $n = read ($fh,$b,2); 
close ($fh); 
return "UTF-16" if ($b eq "\x{ff}\x{fe}"); 
return "ASCII"; 
} 

它被稱爲像這樣:

get_encoding ($l->{file}) 

其中$ L - > {}文件是日誌文件的路徑。

任何人能解釋這是怎麼回事,尤其是在這一行:

return "UTF-16" if ($b eq "\x{ff}\x{fe}"); 

如果有人知道的好方法在PowerShell中做到這一點,任何提示都很大apreciated。

吉斯利

+1

http://enwp.org/UTF-16#Byte_order_encoding_schemes – daxim

+0

這條線對我來說看起來像一個錯誤。我認爲它應該讀取'return「UTF-16」if($ b eq「\ xFF \ xFE」);' - 即:它應該將從文件讀入的字節與字節串而不是字符串進行比較。 '「\ xE9」'是包含單個字節0xE9的字節字符串。 '「\ x {E9}」是包含Unicode代碼點0 + 00E9的字符的字符串。 –

回答

3

該程序讀取並檢查給定文件的前2個字節,以決定是否應返回字符串「ASCII」或「UTF-16」。

這裏有一些更詳細的描述:

如果文件不能打開,無論出於何種原因,則返回「ASCII」。 (奇怪,但是這就是它。)

return "ASCII" if (!open ($fh,"<",$f)); 

如果文件被打開的文件句柄$fhread($fh, $b, 2)第2(8位)字節變量$bread的返回值(意思是實際讀取的字節數)被存儲到變量$n,儘管它從未被後者使用過。

my $b = ""; 
my $n = read ($fh,$b,2); 

文件句柄$fh獲取要讀取之後close編輯權。

close ($fh); 

如果$b值是恰好 「\ X {FF} \ X {FE}」 中, 「UTF-16」 被返回。儘管返回「UTF-16BE」會更準確。 \x{..}是用十六進制值表示字節。因此,存在兩個字節在"\x{ff}\x{fe}",不10或12

return "UTF-16" if ($b eq "\x{ff}\x{fe}"); 

最後,如果$b不等於 「\ X {FF} \ X {FE}」, 「ASCII」 被返回。

return "ASCII"; 
1

http://franckrichard.blogspot.com/2010/08/powershell-get-encoding-file-type.html

function Get-FileEncoding{ 
    [CmdletBinding()] Param (
[Parameter(Mandatory = $True, ValueFromPipelineByPropertyName = $True)] [string]$Path) 
    [byte[]]$byte = get-content -Encoding byte -ReadCount 4 -TotalCount 4 -Path $Path 
    if ($byte[0] -eq 0xef -and $byte[1] -eq 0xbb -and $byte[2] -eq 0xbf) 
    { Write-Output 'UTF8' } 
    elseif 
    ($byte[0] -eq 0xfe -and $byte[1] -eq 0xff) 
    { Write-Output 'Unicode' } 
    elseif ($byte[0] -eq 0 -and $byte[1] -eq 0 -and $byte[2] -eq 0xfe -and $byte[3] -eq 0xff) 
    { Write-Output 'UTF32' } 
    elseif ($byte[0] -eq 0x2b -and $byte[1] -eq 0x2f -and $byte[2] -eq 0x76) 
    { Write-Output 'UTF7'} 
    else 
    { Write-Output 'ASCII' }} 
+0

它表示Unicode的部分不準確,因爲它是一個字符集,而不是編碼。代碼應區分UTF-16BE和UTF-16LE。請修復。 – daxim

+0

與UTF-8相關的部分有些不正確,因爲UTF-8不需要字節順序標記(這是一個字節順序;儘管可能會將其標記爲UTF-8)。最後,如果不使用U + 007f以外的字符,則UTF-8被設計爲可與ASCII交換。 – sstn

+0

@daxim&sstn在我的答案中看到鏈接,有一個更準確的腳本。是不是我的廚房湯,但更好的準確腳本的起點 –

1

腳本讀取兩個字節之前到$ b。從$ F:my $n = read ($fh,$b,2);

問題測試線,他們在這兩個字節是否字面上FF和FE

我猜FF,FE是UTF-16小端編碼的字節順序標記 請看這裏http://unicode.org/faq/utf_bom.html