Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 批处理:添加unicode头或如何添加十六进制值或任何其他方法?_Batch File_Unicode - Fatal编程技术网

Batch file 批处理:添加unicode头或如何添加十六进制值或任何其他方法?

Batch file 批处理:添加unicode头或如何添加十六进制值或任何其他方法?,batch-file,unicode,Batch File,Unicode,我有一个批处理脚本,它使用拖放,并根据拖放文件/文件夹的文件名创建一些html代码。 与 我用这个来写unicode。一切都很好。至少在记事本编辑器中,而浏览器仅显示垃圾。当我在记事本中重新保存文件时,该文件在浏览器中也可以正常工作。 不幸的是,由于与hextump()的比较,创建的unicode文件似乎在文件前面缺少两个“unicode头”字符(0xFF和0xFE) 在这个话题上,我发现: 从那里链接的文件有点不起作用(参数格式错误),这个网站上关于非本地echos等的例子是不可能的。复制一

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

我用这个来写unicode。一切都很好。至少在记事本编辑器中,而浏览器仅显示垃圾。当我在记事本中重新保存文件时,该文件在浏览器中也可以正常工作。 不幸的是,由于与hextump()的比较,创建的unicode文件似乎在文件前面缺少两个“unicode头”字符(0xFF和0xFE)

在这个话题上,我发现:

从那里链接的文件有点不起作用(参数格式错误),这个网站上关于非本地echos等的例子是不可能的。复制一个空的unicodeHeader帮助文件并附加我的文件效果很好,但这是非常不理想的,因为这意味着,从中拖放我的文件的任何文件夹都需要包含此帮助文件。这不是假设的情况,因为它是不现实的,所以这是没有好处的

使用类型也是不可能的,因为它会在字符之间创建大量空白

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

我发现: 而且:

我想我可以将示例十六进制值替换为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

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

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

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

    它使用
    certutil
    进行解码(certutil使用-encode创建文本部分),因此需要Vista和更高版本

    下面是创建包含hex: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"
    

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

    @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 answer(太棒了!)生成文件前缀并尝试了

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

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

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

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

    @echo关闭
    如果[“%~1”]=[”“]转到:EOF
    setlocal enableextensions enabledelayedexpansion
    要生成的rem文件
    设置“myFile=aText.txt”
    rem保存当前页面代码
    对于/f“tokens=2 delims=:”%%f in('chcp')请设置“cp=%%f”
    rem生成BOM表
    调用:generateBOM“%myFile%”
    rem更改为unicode
    chcp 65001>nul
    :循环
    回显%1>>%myFile%
    对于(“%1”)中的%%a,请执行以下操作(
    echo%%~nxa
    回声^^^
    )>>%myFile%
    转移
    如果[“%~1”]=[”“]转到showData
    转到环路
    :showData
    %myFile%
    :结束进程
    rem清理和恢复页面代码
    endlocal&chcp%cp%>nul
    退出/b
    :generateBOM文件
    rem[EF BB BF]utf8 bom编码值=77u/
    rem[FF FE]unicode bom编码值=//4=
    echo 77u/>“%~1”
    rem是的,certutil允许就地解码,因此不需要临时文件
    certutil-f-解码“%~1”“%~1”>nul
    端部
    后藤:EOF
    
    您可以通过
    CertUtil-decodehex
    创建Unicode头(
    0xFF 0xFE
    ):

    rem//创建十六进制编码文件:
    >“header.tmp”(echo FF FE)
    rem//将文件解码为二进制头文件:
    >nul CertUtil-f-decodeChex“header.tmp”“header.tmp”
    rem//组合二进制头文件和Unicode文本文件:
    复制/B“header.tmp”+“U-file.txt”“header.tmp”
    rem//M
    
    @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:ÿþ:
    
    @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