2013-04-26 3 views
1

У меня есть требование, чтобы мой пакетный скрипт обнаружил, является ли тип ввода входного файла для пакетного процесса либо UTF-8, либо нет? Может ли кто-нибудь предложить мне какую-либо идею, можем ли мы найти тип кодировки или нет в окнах ??нахождение типа кодирования с использованием пакетного сценария

+0

Что, собственно, вы пытаетесь делать? Я спрашиваю об этом, потому что вы можете легко преобразовать файлы перед их обработкой, но на самом деле определить, какая кодировка у них немного сложнее. –

+0

Спасибо за ваш ответ. Если файл находится в формате UTF-8, я могу использовать файл как есть. Но когда файл находится в другом формате, мне нужно преобразовать файл в UTF-8 и его нужно обработать. для этого мне нужно знать формат файла. – satish

ответ

4

с certutil вы можете отправить файл в шестнадцатеричном формате. Файлы UTF-8 начинаются с 0xEF,0xBB,0xBF. Итак:

certutil -dump my.file.txt | find "ef bb bf" && echo this is utf-8

Вы можете поместить это в FOR /F петлю, чтобы быть уверенным, что только первая строка обрабатывается.

обновление:

Оказалось, что -dump вариант certutil является buggy .so мне нужно использовать -encodehex, который требует один временный файл:

@echo off 
:detect_encoding 
setLocal 
if "%1" EQU "-?" (
    endlocal 
    call :help 
    exit /b 0 
) 
if "%1" EQU "-h" (
    endlocal 
    call :help 
    exit /b 0 
) 
if "%1" EQU "" (
    endlocal 
    call :help 
    exit /b 0 
) 


if not exist "%1" (
    echo file does not exists 
    endlocal 
    exit /b 54 
) 

if exist "%1\" (
    echo this cannot be used against directories 
    endlocal 
    exit /b 53 
) 

if "%~z1" EQU "0" (
    echo empty files are not accepted 
    endlocal 
    exit /b 52 
) 



set "file=%~snx1" 
del /Q /F "%file%.hex" >nul 2>&1 

certutil -f -encodehex %file% %file%.hex>nul 

rem -- find the first line of hex file -- 

for /f "usebackq delims=" %%E in ("%file%.hex") do (
    set "f_line=%%E" > nul 
    goto :enfdor 
) 
:enfdor 
del /Q /F "%file%.hex" >nul 2>&1 

rem -- check the BOMs -- 
echo %f_line% | find "ef bb bf"  >nul && echo utf-8  &&endlocal && exit /b 1 
echo %f_line% | find "ff fe 00 00" >nul && echo utf-32 LE &&endlocal && exit /b 5 
echo %f_line% | find "ff fe"  >nul && echo utf-16 &&endlocal && exit /b 2 
echo %f_line% | find "fe ff 00"  >nul && echo utf-16 BE &&endlocal && exit /b 3 
echo %f_line% | find "00 00 fe ff" >nul && echo utf-32 BE &&endlocal && exit /b 4 

echo ASCII & endlocal & exit /b 6 



endLocal 
goto :eof 

:help 
echo. 
echo %~n0 file - Detects encoding of a text file 
echo. 
echo for each encoding you will recive a text responce with a name and a errorlevel codes as follows: 

echo  1 - UTF-8 
echo  2 - UTF-16 BE 
echo  3 - UTF-16 LE 
echo  4 - UTF-32 BE 
echo  5 - UTF-32 LE 
echo  6 - ASCII 

echo for empty files you will receive error code 52 
echo for directories you will receive error code 53 
echo for not existing file you will receive error code 54 
goto :eof 
+1

Спасибо за ваш ответ. Ваш ответ действительно полезен для меня. У меня есть еще одно сомнение в том, что для других типов файлов кодировки, таких как unicode и т. Д., Можете ли вы указать изменения, которые нужно выполнить, чтобы найти тип файла? – satish

+0

здесь вы можете найти информацию о других кодировках utf: http://en.wikipedia.org/wiki/Byte_order_mark. Я не уверен, что он будет работать во всех случаях. – npocmaka

+0

проверьте мое обновление пожалуйста. – npocmaka

Смежные вопросы