Как исправить проблему с диакритическими знаками в командной строке?
1423
kokbira
Упрощенная проблема:
У меня есть файл с именем Bíblia sagrada.exe(обратите внимание í) на C:\моем компьютере.
Когда я открываю командную строку на C:\и выполнить dir /b /on B*.*, он возвращает:
Bíblia sagrada.exe
нет проблем с диакритическими символами.
Но когда я делаю dir /b /on B*.*> c: \ a.txt и открываю c:\a.txtс помощью Блокнота, он становится:
B¡blia sagrada.exe
т.е. он заменяет íна ¡.
И если я выполняю for /f "delims=" %i in ('dir /b /on B*.*') do %i > %i.txtэто, он помещает правильное имя в имя файла, но внутри него текст все равно неправильный, т.е.
Имя файла:
Bíblia sagrada.exe.txt
Содержание:
B¡blia sagrada.exe
В чем дело?
PS:
Реальная проблема
Проблема для меня хуже, чем я сообщал при первом редактировании, потому что я читаю содержимое txt-файла, чтобы создать сценарий .vbs, а затем выполнить его; при попытке выполнить «он не понимает», что он указывает на «Bíblia sagrada.exe» и не выполняет программу ... т. е. я создал .bat на d: \ atalhizador \ atalhizador.bat:
@echo off ::locais set drvbak= set drvprogrs= set pathbak=%cd% set pathabove= set pathprogrs=%userprofile%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs ::identificador da pasta do programa no menu iniciar set id=_pext1 ::determina drives de acordo com paths for /f "delims=" %%z in ("%pathbak%") do set drvbak=%%~dz for /f "delims=" %%z in ("%pathprogrs%") do set drvprogrs=%%~dz ::pega caminho superior cd.. set pathabove=%cd% cd %pathbak% cls echo.*************** echo.* ATALHIZADOR * echo.*************** echo. echo.Deseja realmente executar o atalhizador para a pasta: cd.. echo. %cd% cd %pathbak% echo. [s/n]: set /p ___o= if not "%___o%"=="s" if not "%___o%"=="S" goto end echo. echo.Criando os atalhos... for /f "delims=" %%a in ('dir /b /ad /on ..') do ( echo.- pasta "%%a"... echo. ^|-- buscando arquivos atalhizaveis... if not exist "temp" mkdir "temp" dir /b /on "..\%%a\*.exe" 1>temp\busca.txt 2>temp\erros.txt for /f "delims=" %%b in (temp\busca.txt) do ( echo. ^|-- criando atalho para %%b for /l %%z in (1,1,1) do set __temp__= if not exist "%pathprogrs%\%id%" mkdir "%pathprogrs%\%id%" if not exist "%pathprogrs%\%id%\%%a" mkdir "%pathprogrs%\%id%\%%a" echo.Set oWS = WScript.CreateObject^("WScript.Shell"^) > temp\%%~na-%%~nb.vbs echo.sLinkFile = "%pathprogrs%\%id%\%%a\%%b.lnk" >> temp\%%~na-%%~nb.vbs echo.Set oLink = oWS.CreateShortcut^(sLinkFile^) >> temp\%%~na-%%~nb.vbs echo.oLink.TargetPath = "%pathabove%\%%a\%%b" >> temp\%%~na-%%~nb.vbs echo.oLink.Save >> temp\%%~na-%%~nb.vbs cscript /nologo temp\%%~na-%%~nb.vbs ) ) :end %drvbak% cd %pathbak% pause @echo off
Упомянутый «Bíblia sagrada.exe» находится в d: \ Bíblia sagrada.
Сгенерированный файл .vbs находится ниже (предположим, что на d :) есть только эти два каталога с именем файла D: \ atalhizador \ temp \ Bíblia Sagrada-Bíblia Sagrada.vbs:
Set oWS = WScript.CreateObject("WScript.Shell") sLinkFile = "C:\Users\Ubirajara\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\_pext1\B¡blia Sagrada\B¡blia Sagrada.exe.lnk" Set oLink = oWS.CreateShortcut(sLinkFile) oLink.TargetPath = "D:\_pext1\B¡blia Sagrada\B¡blia Sagrada.exe" oLink.Save
Проблема? Ярлык не создан, потому что он не распознает "sLinkFile =" C: \ Users \ Ubirajara \ AppData \ Roaming \ Microsoft \ Windows \ Меню Пуск \ Programs_pext1 \ B¡blia Sagrada \ B¡blia Sagrada.exe.lnk "" ,
Этого не произойдет, если я не использую диакритические знаки, но на самом деле у меня много папок и файлов с этими сигналами ...
Как исправить это, чтобы разрешить правильную запись в файл .vbs?
PS2:
Я попробовал следующие команды, в одиночку и вместе, но безуспешно:
cmd /u chcp 860 chcp 1200 mode con cp select=860 mode con cp select=1200
Также я попробовал это с растром шрифта CMD и с другими доступными шрифтами ...
убедитесь, что вы добавили шрифт, который его поддерживает. http://stackoverflow.com/questions/9321419/unicode-utf-8-text-file-gibberish-on-windows-console-tring-to-display-hebrew, например, Courier New, и загрузите DejaVu Sans Mono и Droid Sans Mono Вы можете добавить эти 3. Последние два должны быть загружены, если вы хотите их.
barlop 8 лет назад
0
Notepad is opening your file with the wrong encoding. Try opening using the Open dialog box, and in the bottom selecting other encodings:
Note that Microsoft uses non-standard names for the encodings. "Unicode" is actually UTF-16LE, and "Unicode big endian" is actually UTF-16BE.
Смотри мое редактирование :) вопрос хуже я написал ...
kokbira 12 лет назад
0
Открытие, как вы предложили, также не решает проблему отображения. В ANSI возникает та же проблема; в Unicode и Unicode с прямым порядком байтов символы алфавита не отображаются; на UTF-8 он заменяет `¡` на ` `, но не на` í` ... Т.е. правильная кодировка "может быть потеряна" :(
kokbira 12 лет назад
0
@kokbira, если блокнот не может открыть его даже шрифтом, который должен показать его, и даже когда вы знаете, что открываете его с соответствующей кодировкой, соответствующей юникодному ному, если он есть, тогда, возможно, он не был записан в файл correct.U может попытаться удалить все символы, кроме забавного, затем, используя xxd, посмотреть, как этот символ записан в файл, вы можете найти что-то, что закодировано неправильно. например, что-то использовало шрифт, который его не поддерживал, и оно заменяло этот символ другим и кодировало какой-то другой символ вместо него. Блокнот был не виноват, когда был показан неправильный символ.
barlop 8 лет назад
0
1
harrymc
Setting the codepage to UTF-8 should help :
chcp 65001
The dir result will then be encoded in UTF8.
If VBS cannot understand it as-is, for the file to be automatically recognized under Windows as UTF8 you will need to prefix it with the UTF8 BOM bytes :
0xEF, 0xBB, 0xBF
You can then start with a file containing the BOM and append to it rather than write :
Хотя chcp 65001 дает сбой компилятору c #. Я полагаю, что это не имеет большого значения, если они не были запущены компилятором c # в этой оболочке. см. «добавленные 2» в вопросе здесь http://stackoverflow.com/questions/30956834/why-is-csc-exe-crashing-when-i-last-left-the-output-encoding-as-utf8
barlop 8 лет назад
0
также, в частности, можно изменить кодовую страницу для перенаправления вывода. chcp изменяет оба и без параметров отображает входную кодировку. Программа, которая показывает и позволяет изменить любую кодировку, называется chcpa https://sourceforge.net/p/chcp-advanced/discussion/general/thread/61312465/
barlop 8 лет назад
0
Я протестировал `chcp`, и он действительно выдает cmd, выходя без сообщения об ошибке, когда вы используете, например,` dir` после его вызова. Но если вы перенаправляете вывод в файл, все в порядке, и выходной файл находится в UTF8. Я пробовал `chcpa`, но Windows 7 не распознает его.
kokbira 8 лет назад
0
Теперь я пытаюсь VBS часть вопроса ...
kokbira 8 лет назад
0
Хотя это не полный ответ, потому что я еще не могу решить часть VBS (мне нужно подумать больше), это лучший ответ.
kokbira 8 лет назад
0
Помогает ли [этот пост] (http://stackoverflow.com/a/13855268/165358)?
harrymc 8 лет назад
0
1
Aganju
You can circumvent the issue by adding /X to all DIR commands.
That will give you the 8.3 short name (DOS-name) of all files; all further operations are valid with this name, and it will not have any of the UTF issues.
может быть, но не могли бы вы рассказать, что 8.3 связано с UTF?
barlop 8 лет назад
0
Имя 8.3 не имеет специальных символов или диакритических знаков, поэтому между разными программами, использующими разные кодировки UTF, не возникнет проблем.
Aganju 8 лет назад
0
Я замечаю, что если я сделаю `dir 2012 *. * / X`, тогда появится полное имя (больше, чем 8.3). А также, если я сделаю `dir א / x`, то это все равно покажет этот персонаж. Поэтому я не думаю, что / x обязательно выполняет 8.3 или изменяет символы, чтобы быть в пределах ascii.
barlop 8 лет назад
0
`/ X` должен находиться перед первым каталогом или файлом, иначе он будет считаться другим каталогом для списка. В вашем первом примере это будет `DIR / X 2012 *. *`.
Aganju 8 лет назад
0
1
Frank Sixteen
To solve the part where wrong font is shown in Notepad you need to use codepage because Notepad use Ansi as default. A better solution is rather using Notepad++ where you can change to the codepage you like and on top of that you could even change to a better shell with support for unicode so that the error doesn't arise to begin with.