Come posso trovare esattamente quali caratteri sono in un nome file?


1

In Windows, i nomi dei file sono memorizzati in Unicode. Poiché ci sono distinti punti di codice Unicode che sembrano identici, non è sempre possibile dire esattamente quale sia effettivamente il nome del file. Ad esempio, due file potrebbero avere quello che sembra essere lo stesso nome anche se il sistema operativo considera i nomi distinti.

Dato un file, qual è il modo più semplice per scoprire quali punti di codice Unicode sono nel nome del file?

Risposte:


1

Finora, l'unica soluzione che ho trovato è copiare e incollare il nome del file da Explorer in un servizio web adatto, come ad esempio questo convertitore di codice Unicode.

Fai clic destro sul file e seleziona "rinomina". Premi Control-C per copiare il nome del file.

Apri il sito web linkato sopra e incolla il nome del file nella casella di testo nella parte superiore della pagina. Premere il pulsante "Punti codice esadecimale" per eseguire la conversione. La rappresentazione esadecimale dei punti di codice apparirà nella casella di testo "Esadecimale" nella parte inferiore della pagina.

Puoi quindi guarda questi codici in alto su Wikipedia .


caratteri ANSI latini standard dovrebbero essere tutti compresi tra 0000 e 007F. Qualsiasi personaggio fuori da quel range è sospetto. en.wikibooks.org/wiki/Unicode/Character_reference/0000-0FFF
Frank Thomas

@ Frank, intendi nel contesto della domanda collegata? Nel caso generale, non c'è motivo di aspettarsi che un nome file sia limitato ai caratteri ANSI latini, in particolare se non si è in un paese di lingua inglese.
Harry Johnston

Infatti. La preoccupazione è rappresentata da caratteri simili, quindi in generale qualsiasi personaggio proveniente da un'altra pagina / piano rispetto al resto della stringa è sospetto, se sembra davvero simile a un personaggio disponibile all'interno della pagina. In questo caso, il i nel MailClient.exe.
Frank Thomas

1

Utilizzare uno script per automatizzare l'esecuzione di attività che potrebbero essere eseguite in alternativa, una per una, da un operatore umano.

Ci sono due utili script IMHO in la mia risposta alla domanda originale su Stack Overflow Windows / NTFS: due file con nomi lunghi identici nella stessa directory? .


appendice per il completamento della storia. Ecco un altro approccio per risolvere l'OQ ( il mio primo tentativo assoluto ). Lo script mette a confronto stringhe (ad esempio nomi di file) della stessa lunghezza carattere per carattere e restituisce caratteri diversi (o non 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
}

Produzione (un po 'difficile da esaminare ...) La prima tabella (con le intestazioni) viene emessa dall'abitudine (regolata) Get-CharInfo cmdlet ; il secondo (senza intestazioni) è spiegato di seguito:

PS D:\PShell> .\SO\43381802.ps1 ( Get-childitem -path 'C:\testC\43381802' ).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

Spiegazione di quest'ultima linea:

  • 8              una posizione di carattere in entrambe le stringhe confrontate
  • e U+0065       un personaggio stesso ed è codepoint Unicode (1a stringa)
  • #              # o = (diverso o uguale ma non ANSI, rispettivamente)
  • е U+0435       un personaggio stesso ed è codepoint Unicode (seconda stringa)
  • МailClient.txt Prima stringa stessa
  • МailCliеnt.txt 2a corda stessa

0

Puoi copiare incollare i nomi in notepad ++, quindi selezionare ASCII - & gt; HEX dal convertitore di base sotto plugins - & gt; converter. Non converte UTF-8 in ANSI, quindi i byte vengono conservati.

Nota che devi selezionare Visualizza - & gt; Mostra simbolo - & gt; tutti i caratteri perché NPP non può visualizzare HEX e devi selezionare tutti i caratteri. Cioè i caratteri non stampabili sono anche solo byte che devono essere convertiti. Ad esempio nella schermata 1 la riga si converte in linea 2.

screenshot.

(ignora i caratteri di nuova riga CR-LF in questo esempio)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.