PDA

Показать полную графическую версию : [решено] FTP vs. 'я' или "о проклятой протоколом букве"


Elven
15-01-2015, 16:32
Согласно RFC 959 протокол FTP не понимает русскую букву «я». Происходит это потому, что в кодировке cp1251 эта буква кодируется как «FF». А это окончание передачи данных. Таким образом мы получаем особенность не позволяющую скачивать с FTP файлы и директории содержащие букву «я». (c)
Кроме того как-то было (http://forum.oszone.net/thread-289339.html) дело настраивалась синхронизация с FTP.
Но то была преамбула, амбула у нас впереди. Повадились пользователи файло в папки обменочные закидывать с той самой проклятой протоколом буквой, а они (файлы) от этого немного совсем не копируются, посему было принято решение переименовывать файлы (менять "я" на "Я"). Теперь наконец два вопроса для тех кто еще не окончательно заколебался читать вышеизложенную белиберду.
- Возможно ли реализовать описанное выше на cmd/bat?
- Возможно ли каким-то красивым образом дополнить то, что было сделано ранее, дабы не плодить лишние задачи в шедулере?

Iska
15-01-2015, 17:01
Возможно ли реализовать описанное выше на cmd/bat? »
Реализовать что именно?

Elven
15-01-2015, 17:16
Iska, переименование файлов. Например чтобы файл с именем "показатели мятателей молота.xlsx" был переименован в "показатели мЯтателей молота.xlsx"

Iska
15-01-2015, 18:52
@echo off
setlocal enableextensions enabledelayedexpansion

set sSourceFolder=E:\Песочница\0421

if exist "%sSourceFolder%\." (
pushd "%sSourceFolder%"

for /f "usebackq delims=" %%i in (
`2^>nul dir /b /a:-d "*.*"`
) do (
set sName=%%~i
set sNewName=!sName:я=Я!

if "!sName!" neq "!sNewName!" (
ren "!sName!" "!sNewName!"
)
)

popd
) else (
echo Can't find source folder [%sSourceFolder%].
exit /b 1
)

endlocal
exit /b 0

Elven
15-01-2015, 20:06
set sNewName=!sName:я=Я! »
Не знал что так можно.
Весьма круто, спасибо.

Georgio
15-01-2015, 22:00
с той самой проклятой протоколом буквой »






Строчная буква "я" "проклята" не только "протоколом", но и интерпретатором командной строки, во всяком случае, в современных ОС Windows.




Информация к размышлению (Windows 8.1):



код пакетного файла в кодировке Win-1251:

@>.txt (
echo яблоко
echo я
echo.я
) --

вывод результата в файл:

яблоко
ђҐ¦Ё¬ ўлў®¤* Є®¬**¤ ** нЄа** (ECHO) ўЄ«озҐ*.
я;


код пакетного файла в кодировке Win-1251:

@<nul>.txt (
set/p="яблоко"
set/p="я"
) --

вывод результата в файл:

блоко.

Iska
15-01-2015, 22:29
Georgio, никто и не обещал работоспособность пакетных файлов в кодировке, отличной от OEM.

Georgio
16-01-2015, 20:47
Georgio, никто и не обещал работоспособность пакетных файлов в кодировке, отличной от OEM. »


Я обещаю:).

Iska, как Вы предлагаете вывести в файл символ "я" (именно символ с кодом "0xFF"), сохранив пакетный файл @<nul>.txt set/p="я" в кодировке OEM-866?

Foreigner
16-01-2015, 21:10
Georgio,
chcp 1251

@echo off
1>nul chcp 1251

0>nul 1>1.txt (

set/p="я"
set /p="яблоко"

)

Georgio
16-01-2015, 21:45
Foreigner, всё верно. Когда писал: Я обещаю:). »,
я это и имел в виду. И это как раз пример того, что именно сохранение самого пакетного файла в кодировке OEM-866 приводит к его неработоспособности. А символ "я" очень актуален для пакетных файлов, например, тогда, когда нужно вставить BOM:

@>nul chcp 1251
@<nul>.txt set/p="яю"

.

Iska
17-01-2015, 01:50
Я обещаю. »
«Нэ вэрю» (с) ;).

Iska, как Вы предлагаете вывести в файл символ "я" (именно символ с кодом "0xFF"), сохранив пакетный файл »
Разве 0xFF? 0xEF.

Например, вот так:
@echo off
<nul >0001.txt set /p sVar=*

введя символ с кодом 0xFF после знака равенства. И именно он будет выведен в файл «0001.txt». Безо всяких «chcp» туда-сюда.

Update: движок форума подменил символ с кодом 0xFF на звёздочку. Я пользовался редактором Far Manager'а.

Georgio
17-01-2015, 04:01
Я обещаю. »
«Нэ вэрю» (с) :wink:. »


«Какьие ваши доказательства?!» (c):wink::).



Iska, как Вы предлагаете вывести в файл символ "я" (именно символ с кодом "0xFF"), сохранив пакетный файл »
Разве 0xFF? 0xEF. »


Символ "я" -- это именно символ с кодом "0xFF": MsgBox Hex(Asc("я")).



Например, вот так:
@echo off
<nul >0001.txt set /p sVar=*
введя символ с кодом 0xFF после знака равенства. И именно он будет выведен в файл «0001.txt». Безо всяких «chcp» туда-сюда.

Update: движок форума подменил символ с кодом 0xFF на звёздочку. Я пользовался редактором Far Manager'а. »


B Windows 7, 8, 8.1 "не пройдёт". "Тамошний" "%ComSpec%" игнорирует символы пробела, символы табуляции и символ "я" (очевидно, также воспринимая его за "пустоту"), если эти символы находятся в начале выводимой строки:

@<nul>.txt set/p="я я яблоко" --
блоко.

Правда, в случае символа "я" речь идёт только о пакетных файлах, в командной строке с этим символом всё нормально.

Iska
17-01-2015, 04:55
Символ "я" -- это именно символ с кодом "0xFF": »
Это в ANSI/1251.

B Windows 7, 8, 8.1 "не пройдёт". "Тамошний" "%ComSpec%" игнорирует символы пробела, символы табуляции и символ "я" (очевидно, также воспринимая его за "пустоту"), если эти символы находятся в начале выводимой строки: »
Это печально :(. И ещё один «гвоздь в гроб» пакетных файлов.

«Какьие ваши доказательства?!» (c). »
«Усы, вот, и хвост — вот мои документы» доказательства! ;)

LehaMechanic
17-01-2015, 07:51
Ужас какой.... Читаю и волосы на голове шевелятся, какие дикости в нашем веке бывают...


«Усы, вот, и хвост — вот мои документы» доказательства! »
В оригинале не так :)
"Усы, лапы, хвост - вот мои документы!"

Iska
17-01-2015, 07:56
В оригинале не так
"Усы, лапы, хвост - вот мои документы!" »
Твою дивизию! Это ж сколько лет мне совсем не то слышалось, а?! Надо ж так опростоволоситься… :(




© OSzone.net 2001-2012