我如何才能准确找到文件名中的字符?

我如何才能准确找到文件名中的字符?

在 Windows 中,文件名以 Unicode 格式存储。由于存在看起来相同的不同 Unicode 代码点,因此并不总是能够准确地说出文件名到底是什么。例如,两个文件可能有看起来是同一个名字即使操作系统认为这些名称是不同的。

给定一个文件,找出文件名中的 Unicode 代码点的最简单方法是什么?

答案1

到目前为止,我发现的唯一解决方案是将文件名从 Explorer 复制并粘贴到合适的 Web 服务中,例如这个Unicode代码转换器。

右键点击文件并选择“重命名”。按 Control-C 复制文件名。

打开上面链接的网站,将文件名粘贴到页面顶部的文本框中。按“十六进制代码点”按钮执行转换。代码点的十六进制表示形式将显示在页面底部的“十六进制”文本框中。

然后您就可以在维基百科上查找这些代码点

答案2

使用脚本自动执行那些可以由人工操作员逐一执行的任务。

我认为有两个有用的脚本我的答案Stack Overflow 上的原始问题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 代码点(第一个字符串)
  • #              #=(分别为不同或相同但非 ANSI)
  • е U+0435      字符本身及其 Unicode 代码点(第二个字符串)
  • МailClient.txt第一弦本身
  • МailCliеnt.txt第二弦本身

答案3

您可以将名称复制粘贴到 notepad++ 中,然后从插件-->转换器下的基本转换器中选择 ASCII-->HEX。它不会将 UTF-8 转换为 ANSI,因此字节会被保留。

请注意,您必须选择视图-->显示符号-->所有字符,因为 NPP 无法显示十六进制,您必须选择所有字符。即非打印字符也只是需要转换的字节。例如,在屏幕截图中,第 1 行转换为第 2 行。

截屏

(本例中忽略 CR-LF 换行符)

相关内容