Как исправить проблему с диакритическими знаками в командной строке?

1380
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 и с другими доступными шрифтами ...

5
убедитесь, что вы добавили шрифт, который его поддерживает. 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 7 лет назад 0

4 ответа на вопрос

4
Mechanical snail

Notepad is opening your file with the wrong encoding. Try opening using the Open dialog box, and in the bottom selecting other encodings:

Encoding selection

Note that Microsoft uses non-standard names for the encodings. "Unicode" is actually UTF-16LE, and "Unicode big endian" is actually UTF-16BE.

Смотри мое редактирование :) вопрос хуже я написал ... kokbira 11 лет назад 0
Открытие, как вы предложили, также не решает проблему отображения. В ANSI возникает та же проблема; в Unicode и Unicode с прямым порядком байтов символы алфавита не отображаются; на UTF-8 он заменяет `¡` на ` `, но не на` í` ... Т.е. правильная кодировка "может быть потеряна" :( kokbira 11 лет назад 0
@kokbira, если блокнот не может открыть его даже шрифтом, который должен показать его, и даже когда вы знаете, что открываете его с соответствующей кодировкой, соответствующей юникодному ному, если он есть, тогда, возможно, он не был записан в файл correct.U может попытаться удалить все символы, кроме забавного, затем, используя xxd, посмотреть, как этот символ записан в файл, вы можете найти что-то, что закодировано неправильно. например, что-то использовало шрифт, который его не поддерживал, и оно заменяло этот символ другим и кодировало какой-то другой символ вместо него. Блокнот был не виноват, когда был показан неправильный символ. barlop 7 лет назад 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 copy EFBBBF.txt a.txt dir /b /on B*.* >> a.txt 

Or you may use copy /b to concatenate the files.

Хотя 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 7 лет назад 0
также, в частности, можно изменить кодовую страницу для перенаправления вывода. chcp изменяет оба и без параметров отображает входную кодировку. Программа, которая показывает и позволяет изменить любую кодировку, называется chcpa https://sourceforge.net/p/chcp-advanced/discussion/general/thread/61312465/ barlop 7 лет назад 0
Я протестировал `chcp`, и он действительно выдает cmd, выходя без сообщения об ошибке, когда вы используете, например,` dir` после его вызова. Но если вы перенаправляете вывод в файл, все в порядке, и выходной файл находится в UTF8. Я пробовал `chcpa`, но Windows 7 не распознает его. kokbira 7 лет назад 0
Теперь я пытаюсь VBS часть вопроса ... kokbira 7 лет назад 0
Хотя это не полный ответ, потому что я еще не могу решить часть VBS (мне нужно подумать больше), это лучший ответ. kokbira 7 лет назад 0
Помогает ли [этот пост] (http://stackoverflow.com/a/13855268/165358)? harrymc 7 лет назад 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 7 лет назад 0
Имя 8.3 не имеет специальных символов или диакритических знаков, поэтому между разными программами, использующими разные кодировки UTF, не возникнет проблем. Aganju 7 лет назад 0
Я замечаю, что если я сделаю `dir 2012 *. * / X`, тогда появится полное имя (больше, чем 8.3). А также, если я сделаю `dir א / x`, то это все равно покажет этот персонаж. Поэтому я не думаю, что / x обязательно выполняет 8.3 или изменяет символы, чтобы быть в пределах ascii. barlop 7 лет назад 0
`/ X` должен находиться перед первым каталогом или файлом, иначе он будет считаться другим каталогом для списка. В вашем первом примере это будет `DIR / X 2012 *. *`. Aganju 7 лет назад 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.

Похожие вопросы