2

我有一个批处理脚本,它使用拖放并根据所删除文件/文件夹的文件名创建一些 html 代码。和

chcp 65001

我得到这个来写unicode。一切都很好。至少在记事本编辑器中,而浏览器只显示垃圾。当我在记事本中重新保存文件时,该文件也可以在浏览器中正常工作。不幸的是,与 hexdump ( http://www.fileformat.info/tool/hexdump.htm )相比,创建的 unicode 文件似乎在文件之前缺少两个“unicode header”字符(0xFF 和 0xFE)结果。

在这个话题上我发现了这个: http ://www.robvanderwoude.com/type.php#Unicode

来自那里的链接文件不起作用(参数格式错误)本网站关于非本地回声等的示例是不可能的。复制一个空的 unicodeHeader-Helper 文件并附加我的文件可以正常工作,但不是最理想的,因为这意味着,我的文件从中拖放的任何文件夹都需要有这个帮助文件。这不假定是既然是不切实际的情况,那就不好了。

使用 type 也是不可能的,因为它会在字符之间创建大量空格。

所以我正在考虑将缺少标题的文件写入临时文件,将两个十六进制值添加到文件中并将临时文件附加到其中。所以基本上直接编写十六进制字符,而不是从空的 unicode 帮助文件中复制它们。

我发现了这个: http ://www.dostips.com/forum/viewtopic.php?f=3&t= 3857 而且这个: Writing characters > 7F (127) as hex strings based on code page 1252 in windows batch file

我想我可以将示例十六进制值替换为 0xFF 和 0xFE 并使其回显到文件:

@echo off
call :hex2Char 0xFF char_FF
call :hex2Char 0xFE char_FE
echo %char_FF% %char_800%
exit /b

:hex2Char  hexString  rtnVar
  for /f delims^=^ eol^= %%A in (
    'forfiles /p "%~dp0." /m "%~nx0" /c "cmd /c echo(%~1"'
  ) do set "%~2=%%A" >> temp.txt 
exit /b

但似乎事情并没有那么简单。由此产生的两个问题: 1. 它在其中写入了一些 unicode 字符,但它与 unicode 帮助文件不同,如 hexdump 所示。

file name: UniHeader.txt
mime type: 

0000-0003:  ef bb bf                                   


file name: temp.txt
mime type: 

0000-0000:                                                   

事实上,我可以更改 FF 或 FE,但它仍然只在 hexdump 输出中打印 0000-0000 ......

  1. 我可以在该文件之后添加我想要的任何内容(例如编写无头文件并将其附加到创建的文件的代码,代码在第二个出口 /b 处停止并且不再写入任何内容。(但删除它会使整个事情根本不起作用,将它移动到文件的末尾使它无法找到被拖放到蝙蝠上的文件)老实说,我目前还没有通过这几个代码行。退出 /b 标志着结束该命令,如果我正确理解它,那么为什么它在第一次退出 /b 后继续工作,但在第二次退出 /b 处停止?我也尝试使用标签和 goto,没有工作。

我现在不知所措。有什么优雅的方法可以解决这个问题吗?

4

3 回答 3

4

您可以在批处理脚本中嵌入 base64 编码部分,该脚本将创建一个 2 字节文件,然后用于copy /b "my_header_file.bin" + "myfile.html" newfile.htm"将目标文件添加到其中。

它用于certutil解码(以及带有 -encode 的 certutil 来创建文本部分),因此需要 Vista 和更高版本。

这是创建包含十六进制的头文件的脚本:FF FE

@echo off
(
echo -----BEGIN CERTIFICATE-----
echo //4=
echo -----END CERTIFICATE-----
)>header.tmp
certutil -decode -f header.tmp "my_header_file.bin" >nul
del header.tmp

copy /b "my_header_file.bin" + "myfile.html" "newfile.html"
move /y "newfile.htm" "myfile.html" >nul
del "my_header_file.bin"
于 2013-11-01T11:06:41.337 回答
2

将它们包含在您的批处理文件中。

@echo off

    for /f "tokens=2 delims=:" %%f in ('findstr /b /c:"BOFM:" "%~dpnx0"') do echo %%f

exit /b
rem Here starts the special characters part
BOFM:ÿþ:

以 BOFM: 开头的行输入为 ALT+charchode 以获取所需的字符。

已编辑 -

我放弃。我无法让它与跨批处理文件、数据文件和编辑器的多个页面代码一致地工作。无法保证会生成什么。所以,我用@foxidrive 回答(太棒了!)来生成文件前缀并尝试了。

我发现,如果我们使用非 unicode 模式(参数)但使用 unicode 页面代码(65001)生成的文件作为前缀,我们正在生成一个标记为 unicode(前缀)的文件,但内容FF FE是不是,我们每个字符只生成一个字节。所以我们得到了“中国人”?字符,只是将单个字节字符流转换为两个字节字符的错误。cmd/u

如果我们使用相同的前缀,但来自一个 unicode cmd(带/u参数)和一个 unicode 页面代码(65001),那么会生成一个真正的 unicode 文件,并且可以从命令行、记事本和浏览器正确显示内容(在 ie 和 firefox 中测试) )。但这是一个真正的 unicode 文件,因此每个字符生成两个字节。

代替FF FE,我们可以发送一个 utf8 BOM EF BB BF,从一个非 unicode cmd 但使用 unicode 页面代码。这会生成一个带有 BOM 前缀的 utf8,一个或多字节的字符(取决于每个字符的 utf 编码),它在编辑器和浏览器中正确显示,但在命令行中显示不正确。

我一直在尝试的代码(改编自 OP 附加文件)是(从非 unicode cmd 运行):

@echo off

    if ["%~1"]==[""] goto :EOF

    setlocal enableextensions enabledelayedexpansion

    rem File to generate
    set "myFile=aText.txt"

    rem save current pagecode
    for /f "tokens=2 delims=:" %%f in ('chcp') do set "cp=%%f"

    rem Generate BOM
    call :generateBOM "%myFile%"

    rem change to unicode 
    chcp 65001 > nul 

:loop
    echo %1 >> "%myFile%"
    for %%a in ("%1") do (
        echo %%~nxa 
        echo   ^<br^>^<img src='%%~nxa'^>^<br^> 
    ) >> "%myFile%"

    shift
    if ["%~1"]==[""] goto showData
    goto loop   

:showData

    "%myFile%"

:endProcess
    rem Cleanup and restore pagecode
    endlocal & chcp %cp% > nul 

    exit /b 

:generateBOM file
    rem [ EF BB BF ] utf8 bom     encoded value = 77u/
    rem [ FF FE ]    unicode bom  encoded value = //4=
    echo 77u/>"%~1"

    rem Yes, certutil allows decode inplace, so no temporary file needed
    certutil -f -decode "%~1" "%~1" >nul

    endlocal
    goto :EOF
于 2013-11-01T11:44:19.990 回答
1

您可以通过以下方式创建 Unicode 标头 ( 0xFF 0xFE) CertUtil -decodehex

rem // Create hexadecimal-encoded file:
> "header.tmp" (echo FF FE)
rem // Decode file to binary header file:
> nul CertUtil -f -decodehex "header.tmp" "header.tmp"

rem // Combine binary header file and Unicode text file:
copy /B "header.tmp" + "U-file.txt" "header.tmp"
rem // Move combined file over original Unicode text file:
move /Y "header.tmp" "U-file.txt"

使用的方法forfiles /P "%~dp0." /M "%~nx0" /C "cmd /C echo(0xFF0xFE"是有问题的,因为echo会产生尾随换行符。is的替代echo(0xFF0xFE方法< nul set /P ="0xFF0xFE",但这也不起作用,因为set /P从消息文本中删除了前导空格,并且0xFF被认为是这样的(它是一个不间断的空格),不幸的是。

于 2016-12-14T12:28:03.477 回答