在 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
第二弦本身