Como posso encontrar exatamente quais caracteres estão em um nome de arquivo?

1

No Windows, os nomes dos arquivos são armazenados em Unicode. Como existem pontos de código Unicode distintos que parecem idênticos, nem sempre é possível dizer exatamente qual é o nome do arquivo. Por exemplo, dois arquivos podem ter o que parece ser o mesmo nome , embora o sistema operacional considere os nomes como distintos.

Dado um arquivo, qual é a maneira mais fácil de descobrir quais pontos de código Unicode estão no nome do arquivo?

    
por Harry Johnston 14.04.2017 / 00:58

3 respostas

1

Até agora, a única solução que encontrei é copiar e colar o nome do arquivo do Explorer em um serviço da Web adequado, como este conversor de código Unicode.

Clique com o botão direito no arquivo e selecione "renomear". Pressione Control-C para copiar o nome do arquivo.

Abra o site vinculado acima e cole o nome do arquivo na caixa de texto na parte superior da página. Pressione o botão "Pontos de código hexadecimais" para realizar a conversão. A representação hexadecimal dos pontos de código aparecerá na caixa de texto "Hexadecimal" na parte inferior da página.

Você pode, então, procurar esses códigos na Wikipédia .

    
por 14.04.2017 / 00:58
1

Use um script para automatizar a execução de tarefas que podem, alternativamente, ser executadas uma a uma por um operador humano.

Existem IMHO dois scripts úteis em minha resposta para a pergunta original no Stack Overflow Windows / NTFS: Dois arquivos com nomes longos idênticos no mesmo diretório? .

Adendo para fins de conclusão do histórico. Aqui está outra abordagem para resolver o OQ ( minha primeira tentativa absoluta ). O script compara strings (por exemplo, nomes de arquivos) do mesmo caractere de comprimento por caractere e gera resultados diferentes (ou não-ANSI):

param( [string[]] $strArr = @('ΗGreek', 'НCyril', 'HLatin') )
Set-StrictMode -Version latest
$strDiff = ''
$arrDiff = @()
for ($i=0; $i -lt $strArr.Count; $i++) {
  for ($j=$i+1; $j -lt $strArr.Count; $j++) {
    if ( ($i -ne $j) -and ( $strArr[$i].Length -eq $strArr[$j].Length) ) {
      for ($k=0; $k -lt $strArr[$i].Length; $k++) {
        if ( #  -and # different characters AND 
            ( [int][char]$strArr[$i][$k] -gt 255 -or 
                [int][char]$strArr[$j][$k] -gt 255 ) )
        { # at least one is out of pure ASCII range
          if ( $strArr[$i][$k] -ne $strArr[$j][$k] ) {$Eq = '#'} else {$Eq = '='}
          if ( $strDiff -notmatch $strArr[$i][$k] ) { $strDiff += $strArr[$i][$k]}
          if ( $strDiff -notmatch $strArr[$j][$k] ) { $strDiff += $strArr[$j][$k]}
          $arrDiff += "{0,4} {1} U+{2:x4} $Eq {3} U+{4:x4} {5} {6}" -f 
            ($k+1), $strArr[$i][$k], [int][char]$strArr[$i][$k], 
                        $strArr[$j][$k], [int][char]$strArr[$j][$k], 
                        $strArr[$i], $strArr[$j]
        }
      }

    }
  }
}
if ($strDiff.Length -ne 0 ) { 
    if ( Get-Command -Name Get-CharInfo -ErrorAction SilentlyContinue ) {
      $strDiff | Get-CharInfo
    }
    ''         # an indent line
    $arrDiff
}

Saída (um pouco difícil de pesquisar ...) A primeira tabela (com cabeçalhos) é produzida a partir do personalizado (ajustado) Get-CharInfo cmdlet ; o último (sem cabeçalhos) é explicado abaixo:

PS D:\PShell> .\SO381802.ps1 ( Get-childitem -path 'C:\testC381802' ).Name

Char CodePoint        Category Description
---- ---------        -------- -----------
   e U+0065    LowercaseLetter Latin Small Letter E
   е U+0435    LowercaseLetter Cyrillic Small Letter Ie
   M U+004D    UppercaseLetter Latin Capital Letter M
   М U+041C    UppercaseLetter Cyrillic Capital Letter Em

   8 e U+0065 # е U+0435 MailClient.txt MailCliеnt.txt
   1 M U+004d # М U+041c MailClient.txt МailClient.txt
   1 M U+004d # М U+041c MailClient.txt МailCliеnt.txt
   8 e U+0065 # е U+0435 MailClient.txt МailCliеnt.txt
   1 M U+004d # М U+041c MailCliеnt.txt МailClient.txt
   8 е U+0435 # e U+0065 MailCliеnt.txt МailClient.txt
   1 M U+004d # М U+041c MailCliеnt.txt МailCliеnt.txt
   8 е U+0435 = е U+0435 MailCliеnt.txt МailCliеnt.txt
   1 М U+041c = М U+041c МailClient.txt МailCliеnt.txt
   8 e U+0065 # е U+0435 МailClient.txt МailCliеnt.txt

Explicação da última linha:

  • 8              uma posição de caractere em ambas as cadeias de comparação
  • e U+0065       um caractere e seu codepoint Unicode (1a string)
  • #              # ou = (diferente ou igual, mas não ANSI, respectivamente)
  • е U+0435       um caractere em si e o codepoint do Unicode (segunda string)
  • МailClient.txt primeira string
  • МailCliеnt.txt 2º string em si
por 04.05.2017 / 03:23
0

Você pode copiar e colar os nomes no notepad ++ e, em seguida, selecionar ASCII - > HEX no conversor básico em plugins - > converter. Ele não converterá UTF-8 em ANSI, portanto os bytes serão preservados.

Note que você tem que selecionar view - > Show symbol - > todos os caracteres porque o NPP não pode exibir HEX e você deve selecionar todos os caracteres. Ou seja os caracteres não imprimíveis também são apenas bytes que precisam ser convertidos. Por exemplo, na linha de screenshot 1 converte na linha 2.

.

(ignore os caracteres de nova linha CR-LF neste exemplo)

    
por 04.05.2017 / 06:52