2013-11-01 23 views
2

我有一個批處理腳本,它使用拖放操作並基於所刪除的文件/文件夾的文件名創建一些html代碼。 With批處理:添加一個unicode頭或如何添加十六進制值或任何其他方式圍繞?

chcp 65001 

我得到這個寫unicode。一切都很好,很好。至少在記事本編輯器中,瀏覽器只顯示垃圾。當我用記事本重新保存文件時,該文件也可以在瀏覽器中正常工作。 不幸的是它似乎創建Unicode文件丟失兩個「的Unicode頭」字符(0xFF和0xFE的),該文件前右,與hexdump都(http://www.fileformat.info/tool/hexdump.htm)相比,產生的結果。

關於這個話題我發現這一點: http://www.robvanderwoude.com/type.php#Unicode

鏈接文件從那裏各種各樣的不工作(參數格式錯誤)從本網站上的非本地回聲等例子是出了問題。複製一個空的unicodeHeader-Helper文件並追加我的文件可以正常工作,但是非常不理想,因爲它意味着任何文件夾,從中我的文件被拖拽和掉線都需要這個幫助文件。這種情況是不切實際的,所以這是不好的。

使用類型也出了問題,因爲它創造了一大堆的字符之間的空格中。

所以我就想用缺少的頭到一個臨時文件,寫入文件,添加兩個十六進制值到一個文件和臨時文件追加到它。所以基本上直接寫十六進制字符,而不是從空的unicode助手文件複製它們。

我發現這一點: http://www.dostips.com/forum/viewtopic.php?f=3&t=3857 ,而且這樣的: Writing characters > 7F (127) as hex strings according to 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,它仍然只是打印0000-0000在hexdump都可以輸出...

  • 我可以添加任何我想要的在這個文件之後(像編寫我的無頭文件的代碼並將其附加到創建的文件中,代碼在第二個出口/ b處停止,並且不再寫任何東西(但是刪除它使得整個事情根本不起作用並將其移動到文件末尾使其無法找到該文件被丟棄到蝙蝠) 說實話我並不是通過這幾個代碼行的時刻得到。退出/ b標誌着命令結束,如果我然後,正確地得到它爲什麼它會在第一個出口/ b後繼續工作,而在第二個出口/ b處停止?我也嘗試與標籤和轉到,沒有工作。
  • 我很茫然現在。有沒有什麼優雅的方法來解決這個問題?

    回答

    1

    其中包括您的批處理文件中。

    @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回答(真棒!)生成文件前綴並嘗試。

    我所發現的是,如果我們使用FF FE作爲不以Unicode模式(/u參數)從cmd生成的文件的前綴,但以Unicode pagecode(65001),我們正在生成標記爲Unicode文件(前綴),但內容不是,我們只爲每個字符生成一個字節。那麼我們得到「中國人」?字符,只是單個字節字符流轉換爲兩個字節字符的錯誤翻譯。

    如果我們使用相同的前綴,但從unicode cmd(使用/u參數)和unicode pagecode(65001),然後生成一個真正的unicode文件,並從命令行,記事本和瀏覽器正確顯示內容(在IE和Firefox中測試)。但這是一個真正的unicode文件,因此每個字符生成兩個字節。

    而不是FF FE,我們可以發送一個UTF8 BOM EF BB BF,從一個非unicode命令,但與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 
    
    +0

    如果我理解你是正確的,那麼在這裏顯示爲ÿþ的字符被認爲是爲unicode頭添加的兩個字符?你想要直接輸入並插入到文件中?我不確定,如果我知道如何在BOFM後面輸入字符:部分。至少在我的鍵盤上,Alt + FE或ALT-FF沒有做任何事情。但是,我可能讓你完全錯誤? – kumoyadori

    +0

    按住Alt鍵並按數字鍵盤0255(0xff)或0254(0xFE)。在頁碼850中,這些字符顯示在答案中。 'for'命令只是爲了強調和/或分離代碼,但將它們分配給變量並回顯它們是沒有問題的。請記住,echo輸出爲0x0D 0x0A(crlf)。如果這是一個問題,請使用通常的'echo%var%| set/p ='技巧來刪除crlf –

    +0

    我得到了輸入的兩個字符,謝謝。然而,我仍然堅定地認爲,我如何將這個工作與我自己的代碼結合起來。像現在一樣,例如它像這樣鬆動:https://www.dropbox.com/s/jipf45j6vcj82sv/MC%20ND%20Batch%20test.bat,但它會在退出\ b後停止,此後不再執行任何操作。我認爲,我可能還是不明白如何正確處理exit \ b命令... – kumoyadori

    4

    您可以嵌入在一個批處理腳本base64編碼的部分,這將創建一個2字節的文件,然後使用copy /b "my_header_file.bin" + "myfile.html" newfile.htm"到目標文件添加到它。

    它使用certutil來解碼(並certutil與-encode創建文本部分),因此需要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" 
    
    +0

    我將批量創建的html文件重命名爲「myfile.html」,並按原樣使用腳本對其進行了嘗試。奇怪的是,我在newfile.html中得到了一堆隨機中文字符和一些更難以顯示的unicode。我有Windows 7,所以certutil不可用不應該成爲問題。它會是什麼,那是錯誤的? – kumoyadori

    +0

    我猜這個文件不是unicode-with-header-missing。添加標題可能會使其將該文件解釋爲雙字節的unicode文件,因此每兩個相鄰的字符組成一個Unicode字符。如果你可以粘貼開始的十六進制轉儲,它應該是明確的,因爲在一個Unicode文件中,許多第二個字符是十六進制00. – foxidrive

    +0

    它毫無疑問是丟失了unicode-header。我試圖打開它,並且chrome顯示unicode的垃圾。 Hexdump顯示:文件名:myfile.html 0000-0010:44 3a 5c 44-72,執行完bat後只有你的代碼片段出來:文件名:myfile.html 0000-0010:44 3a 5c 44-72,so這兩個字符似乎被添加了,但是這個html顯示了像㩄潲潲擾硯䑜汮慯獤䑜睯汮慯[...]這樣的東西。我真的不知道究竟出了什麼問題...... – kumoyadori

    1

    您可以通過CertUtil -decodehex創建的Unicode頭(0xFF 0xFE) :

    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產生一個尾隨的換行符。 echo(0xFF0xFE的替代方法是< nul set /P ="0xFF0xFE",但這也不起作用,因爲set /P從消息文本中刪除了前導空白,並且0xFF被認爲是這樣(它是非休息空間),不幸的是。

    相關問題