避免在文件和文件夹名称中使用重音字符。否则,mojibake 在 Windows 命令行中得到保证。
md files 2>NUL
pushd files
md unASCII 2>NUL
chcp 852 >nul
echo ěščřžýáíé-852>diacritic--852.txt
chcp 1250 >nul
echo ěščřžýáíé1250>diacritic-1250.txt
chcp 1250 >nul
findstr /R "^" "diacritic-*.txt"
for %G in (diacritic*.txt) do @for /F %g in (%G) do @echo %G:%g
for %G in (diacritic*.txt) do @for /F %g in (%G) do @echo(%~nG:%g>"unASCII\%gANSI.txt"
chcp 852 >nul
findstr /R "^" "diacritic-*.txt"
for %G in (diacritic*.txt) do @for /F %g in (%G) do @echo %G:%g
for %G in (diacritic*.txt) do @for /F %g in (%G) do @echo(%~nG:%g>"unASCII\%g-OEM.txt"
popd
请注意,上面的CLI 命令列表不是.bat 代码sn-p。但是,在命令行窗口中复制和粘贴它会给出大致的下一个 输出,显示当文件创建并且使用必须响起时代码页实际在彼此。否则,一个结晶的 mojibake 可见,参见例如findstr /R "^" "diacritic-*.txt":
==>md files 2>NUL
==>pushd files
==>md unASCII 2>NUL
==>chcp 852 >nul
==>echo ěščřžýáíé-852>diacritic--852.txt
==>chcp 1250 >nul
==>echo ěščřžýáíé1250>diacritic-1250.txt
==>
==>chcp 1250 >nul
==>findstr /R "^" "diacritic-*.txt"
diacritic--852.txt:Řçźý§ě ˇ‚-852
diacritic-1250.txt:ěščřžýáíé1250
==>for %G in (diacritic*.txt) do @for /F %g in (%G) do @echo %G:%g
diacritic--852.txt:Řçźý§ě ˇ‚-852
diacritic-1250.txt:ěščřžýáíé1250
==>for %G in (diacritic*.txt) do @for /F %g in (%G) do @echo(%~nG:%g>"unASCII\%gANSI.txt"
==>chcp 852 >nul
==>findstr /R "^" "diacritic-*.txt"
diacritic--852.txt:ěščřžýáíé-852
diacritic-1250.txt:ýÜŔ°×řßÝÚ1250
==>for %G in (diacritic*.txt) do @for /F %g in (%G) do @echo %G:%g
diacritic--852.txt:ěščřžýáíé-852
diacritic-1250.txt:ýÜŔ°×řßÝÚ1250
==>for %G in (diacritic*.txt) do @for /F %g in (%G) do @echo(%~nG:%g>"unASCII\%g-OEM.txt"
==>popd
我们已将ěščřžýáíé 字符串(后跟 CHCP 编号)写入下一个文件:
-
files\diacritic--852.txt 文件中的 ěščřžýáíé-852 字符串,以及
-
files\diacritic-1250.txt 文件中的ěščřžýáíé1250 字符串。
然后,我们使用这些字符串创建 <String><Chcp><CPID>.txt 名称模式的文件,其中
-
<String> = ěščřžýáíé 从diacritic-<Chcp>.txt 文件中读取的带有变音符号的字符串;
-
<Chcp> = -852 或 1250:diacritic-<Chcp>.txt 文件所在的代码页;
-
<CPID> = -OEM 或 ANSI:编写此文件的代码页名称的文本缩写(分别为852 和 1250)。
让我们尝试使用最后四个文件:Copy&Paste 再次在命令行窗口中code sn-p:
chcp 437 >nul
dir /B /S "files\unASCII\*.txt"
for %G in (files\unASCII\ěščřžýáíé*.txt) do @echo %G
findstr /S /R "^" "files\unASCII\ěščřžýáíé*.txt"
chcp 1250 >nul
for %G in (files\unASCII\ěščřžýáíé*.txt) do type "%G"
chcp 852 >nul
for %G in (files\unASCII\ěščřžýáíé*.txt) do type "%G"
输出:我们可以一次又一次地看到 mojibake:
==>chcp 437 >nul
==>dir /B /S "files\unASCII\*.txt"
d:\bat\files\unASCII\ýÜŔ°×řßÝÚ1250-OEM.txt
d:\bat\files\unASCII\ěščřžýáíé-852-OEM.txt
d:\bat\files\unASCII\ěščřžýáíé1250ANSI.txt
d:\bat\files\unASCII\Řçźý§ě ˇ‚-852ANSI.txt
==>for %G in (files\unASCII\ěščřžýáíé*.txt) do @echo %G
files\unASCII\ěščřžýáíé-852-OEM.txt
files\unASCII\ěščřžýáíé1250ANSI.txt
==>findstr /S /R "^" "files\unASCII\ěščřžýáíé*.txt"
==>
==>chcp 1250 >nul
==>for %G in (files\unASCII\ěščřžýáíé*.txt) do type "%G"
==>type "files\unASCII\ěščřžýáíé-852-OEM.txt"
diacritic--852:Řçźý§ě ˇ‚-852
==>type "files\unASCII\ěščřžýáíé1250ANSI.txt"
diacritic-1250:ěščřžýáíé1250
==>chcp 852 >nul
==>for %G in (files\unASCII\ěščřžýáíé*.txt) do type "%G"
==>type "files\unASCII\ěščřžýáíé-852-OEM.txt"
diacritic--852:ěščřžýáíé-852
==>type "files\unASCII\ěščřžýáíé1250ANSI.txt"
diacritic-1250:ýÜŔ°×řßÝÚ1250
OOPS,为什么findstr 没有输出?让我们使用
chcp 1250 >nul
findstr /S /R "^" "files\unASCII\*.txt"
chcp 852 >nul
findstr /S /R "^" "files\unASCII\*.txt"
输出显示findstr 不仅在文件contents中而且在文件names中导致mojibake > 还有:
==>chcp 1250 >nul
==>findstr /S /R "^" "files\unASCII\*.txt"
FINDSTR: Cannot open files\unASCII\ŤsR›zr ˇ‚1250-OEM.txt
FINDSTR: Cannot open files\unASCII\escrzŤ˙'-852-OEM.txt
FINDSTR: Cannot open files\unASCII\escrzŤ˙'1250ANSI.txt
FINDSTR: Cannot open files\unASCII\RÎzŤäe?'-852ANSI.txt
==>chcp 852 >nul
==>findstr /S /R "^" "files\unASCII\*.txt"
FINDSTR: Cannot open files\unASCII\ŹsRŤzráíé1250-OEM.txt
FINDSTR: Cannot open files\unASCII\escrzŹ ş'-852-OEM.txt
FINDSTR: Cannot open files\unASCII\escrzŹ ş'1250ANSI.txt
FINDSTR: Cannot open files\unASCII\R╬zŹńeś?'-852ANSI.txt
仅供参考:CHCP 65001 (UTF-8) 也无济于事...根据MSDN: Naming Files, Paths, and Namespaces,Windows NTFS 对象名称似乎是UTF-16 编码的:
在较新的文件系统上,例如 NTFS、exFAT、UDFS 和 FAT32,
Windows 以 Unicode 的形式将长文件名存储在磁盘上...文件
系统将路径和文件名视为 WCHARs 的不透明序列。
此外:
shell 和文件系统有不同的要求。 这是
可以使用 shell 用户的 Windows API 创建路径
接口无法正确解释。