Jak mogę znaleźć dokładnie, jakie znaki są w nazwie pliku?

1

W systemie Windows nazwy plików są przechowywane w standardzie Unicode. Ponieważ istnieją różne punkty kodu Unicode, które wyglądają identycznie, nie zawsze można dokładnie powiedzieć, jaka jest faktycznie nazwa pliku. Na przykład dwa pliki mogą mieć taką samą nazwę, nawet jeśli system operacyjny uznaje te nazwy za różne.

Biorąc pod uwagę plik, jaki jest najłatwiejszy sposób, aby dowiedzieć się, jakie punkty kodu Unicode są w nazwie pliku?

Harry Johnston
źródło

Odpowiedzi:

1

Jak dotąd jedynym rozwiązaniem, jakie znalazłem, jest skopiowanie i wklejenie nazwy pliku z Eksploratora do odpowiedniej usługi internetowej, takiej jak ten konwerter kodu Unicode.

Kliknij plik prawym przyciskiem myszy i wybierz „zmień nazwę”. Naciśnij Control-C, aby skopiować nazwę pliku.

Otwórz witrynę internetową, do której prowadzi link powyżej, i wklej nazwę pliku w polu tekstowym u góry strony. Naciśnij przycisk „Hex code point”, aby wykonać konwersję. Szesnastkowa reprezentacja punktów kodowych pojawi się w polu tekstowym „Szesnastkowy” u dołu strony.

Następnie możesz sprawdzić te punkty kodu w Wikipedii .

Harry Johnston
źródło
wszystkie standardowe znaki łacińskie ANSI powinny zawierać się między 0000 a 007F. Każda postać spoza tego zakresu jest podejrzana. en.wikibooks.org/wiki/Unicode/Character_reference/0000-0FFF
Frank Thomas
@Frank, masz na myśli w kontekście połączonego pytania? W ogólnym przypadku nie ma powodu, aby oczekiwać, że nazwa pliku będzie ograniczona do znaków alfabetu łacińskiego ANSI, szczególnie jeśli nie jesteś w kraju anglojęzycznym.
Harry Johnston,
W rzeczy samej. Problem dotyczy znaków podobnych, więc ogólnie każdy znak, który pochodzi z innej strony / płaszczyzny niż reszta ciągu, jest podejrzany, jeśli naprawdę wygląda tak samo jak znak dostępny na stronie. W tym przypadku iw MailClient.exe.
Frank Thomas
1

Użyj skryptu, aby zautomatyzować wykonywanie zadań, które alternatywnie mogą być wykonywane jeden po drugim przez człowieka.

W mojej odpowiedzi na oryginalne pytanie dotyczące przepełnienia stosu w systemie Windows / NTFS znajdują się dwa przydatne skrypty IMHO : dwa pliki o identycznych długich nazwach w tym samym katalogu? .


Dodatek dla uzupełnienia historii. Oto inne podejście do rozwiązania OQ ( moja absolutnie pierwsza próba ). Skrypt porównuje ciągi znaków (np. Nazwy plików) o tej samej długości znak po znaku i wypisuje różne (lub inne niż 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
}

Wyjście (nieco trudne do zbadania…) Pierwsza tabela (z nagłówkami) jest wyprowadzana z (dostosowanego) niestandardowego polecenia Get-CharInfocmdlet ; ten drugi (bez nagłówków) wyjaśniono poniżej:

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

Objaśnienie drugiego wiersza:

  • 8              pozycja znaku w obu porównywanych ciągach
  • e U+0065       sam znak i jego kod Unicode (1. ciąg)
  • #              #lub =(odpowiednio inny lub taki sam, ale inny niż ANSI)
  • е U+0435       sam znak i jego kod Unicode (drugi ciąg)
  • МailClient.txt Pierwszy ciąg sam w sobie
  • МailCliеnt.txt Sam drugi ciąg
JosefZ
źródło
0

Możesz skopiować wkleić nazwy do notatnika ++, a następnie wybrać ASCII -> HEX z podstawowego konwertera pod wtyczkami -> konwerter. Nie konwertuje UTF-8 na ANSI, więc bajty zostają zachowane.

Uwaga: musisz wybrać widok -> Pokaż symbol -> wszystkie znaki, ponieważ NPP nie może wyświetlić HEX i musisz wybrać wszystkie znaki. Oznacza to, że znaki niedrukowalne to także bajty, które wymagają konwersji. Na przykład na zrzucie ekranu linia 1 jest konwertowana na linię 2.

zrzut ekranu.

(w tym przykładzie zignoruj ​​znaki nowego wiersza CR-LF)

jiggunjer
źródło