1

В Windows имена файлов хранятся в Unicode. Поскольку существуют отдельные кодовые точки Unicode, которые выглядят одинаково, не всегда возможно точно сказать, каково имя файла на самом деле. Например, два файла могут иметь одно и то же имя, даже если операционная система считает их разными.

Что касается файла, какой самый простой способ узнать, какие кодовые точки Unicode присутствуют в имени файла?

3 ответа3

1

Используйте сценарий для автоматизации выполнения задач, которые в качестве альтернативы могут выполняться человеком-оператором.

В моем ответе на оригинальный вопрос о переполнении стека Windows / NTFS есть два полезных сценария : два файла с одинаковыми длинными именами в одном каталоге? ,


Приложение для завершения истории. Вот еще один подход к решению OQ (моя абсолютно первая попытка). Скрипт сравнивает строки (например, имена файлов) одинаковой длины символ за символом и выводит разные (или не-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
}

Вывод (немного сложный для просмотра…) Первая таблица (с заголовками) выводится из (скорректированного) пользовательского командлета Get-CharInfo ; последний (без заголовков) объясняется ниже:

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

Объяснение последней строки:

  • 8              позиция символа в обеих сравниваемых строках
  • e U+0065       сам символ и его код Unicode (1-я строка)
  • #              # или = (разные или одинаковые, но не ANSI, соответственно)
  • е U+0435       сам символ и его код Unicode (2-я строка)
  • МailClient.txt 1-я строка
  • МailCliеnt.txt 2-я строка
1

Пока что единственное решение, которое я нашел, - это скопировать и вставить имя файла из Проводника в подходящий веб-сервис, такой как этот конвертер кода Unicode.

Щелкните правой кнопкой мыши по файлу и выберите "переименовать". Нажмите Control-C, чтобы скопировать имя файла.

Откройте веб-сайт, указанный выше, и вставьте имя файла в текстовое поле в верхней части страницы. Нажмите кнопку "Hex code points", чтобы выполнить преобразование. Шестнадцатеричное представление кодовых точек появится в текстовом поле "Шестнадцатеричное" в нижней части страницы.

Затем вы можете посмотреть эти пункты кода в Википедии.

0

Вы можете скопировать и вставить имена в notepad++, затем выбрать ASCII -> HEX из базового конвертера в разделе плагины -> конвертер. Он не преобразует UTF-8 в ANSI, поэтому байты сохраняются.

Обратите внимание, что вы должны выбрать вид -> Показать символ -> все символы, потому что NPP не может отображать HEX, и вы должны выбрать все символы. Т.е. непечатные символы - это также просто байты, которые нужно преобразовать. Например, на скриншоте строка 1 преобразуется в строку 2.

Скриншот ,

(игнорировать символы новой строки CR-LF в этом примере)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .