Получить кодировку строки, прочитанной из файла - PullRequest
0 голосов
/ 10 ноября 2011

Я пытаюсь преобразовать скрипт 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 -> {file} - путь к файлу журнала.

Может кто-нибудь объяснить, что происходит, особенно в этой строке:

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

И если кто-нибудь знает хороший способ сделать это в PowerShell, любые советы очень ценятся.

Гисли

Ответы [ 3 ]

3 голосов
/ 10 ноября 2011

Программа считывает и проверяет первые 2 байта данного файла, чтобы решить, следует ли возвращать строку «ASCII» или «UTF-16».

Вот более подробное описание:

Если файл не может быть открыт по какой-либо причине, он возвращает «ASCII».(Странно, но это то, что он делает.)

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

Если файл открывается как дескриптор файла $fh, read($fh, $b, 2) первые 2 (8-битные) байта в переменной $b.Возвращаемое значение read, означающее количество фактически прочитанных байтов, сохраняется в переменной $n, хотя оно никогда не используется последним.

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

Дескриптор файла $fh получаетбыть close ed сразу после чтения.

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 голос
/ 10 ноября 2011

сценарий считал два байта ранее в $ b из $ f: my $n = read ($fh,$b,2);

рассматриваемая строка проверяет эти два байта, являются ли они буквально FF и FE

Я предполагаю FF,FE - это метка порядка байтов для кодировки с прямым порядком байтов UTF-16, см. Здесь http://unicode.org/faq/utf_bom.html

1 голос
/ 10 ноября 2011

С 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' }}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...