Массово переконвертировать файлы из UTF в ANSI

AE169

Подскажите нормальную утилиту для массового конвертирования файлов? Нужно скормить дерево каталогов, чтобы оно сконвертировало все в ANSI из UTF-8.

AlexV769

iconv, mv, sh

yroslavasako

find ./ -type f -exec recode cp1251..utf8 {} \;

salamander

1. Не любой символ из UTF-8 есть в ANSI.
2. Те символы, которые есть в ANSI имеют такую же кодировку и в UTF-8 и не требуют дополнительной конвертации.
Здесь я подразумевал, что под ANSI ты понимаешь ANSI X3.4 (т.е. ASCII)
Для произвольной же конвертации используй find + iconv.

Serab

Под ANSI чаще всего подразумевают произвольную однобайтовую (может еще MBCS, не помню) кодировку.

salamander

А, я кажется понял. Это виндузовый жаргон такой, никакого отношения к ANSI не имеющий.

Windows ANSI
Since Windows GDI overrides the need for text-based line draw characters, the old OEM line-draw characters could be freed up for something more useful, like international characters and publishing symbols. An assortment of 256-character Windows ANSI character sets cover all the 8-bit languages targeted by Windows.
You can think of Windows ANSI as a lower 128, and an upper 128. The lower 128 is identical to ASCII, and the upper 128 is different for each ANSI character set, and is where the various international characters are parked.

tokuchu

А, я кажется понял. Это виндузовый жаргон такой, никакого отношения к ANSI не имеющий.
Я тоже позанудствую. Он не указал разновидность UTF. :)

Serab

да-да

Filan

recode
iconv же.

yroslavasako

iconv же.
recode юзает эту либу. Но умеет юзать inplace. А с iconv надо будет создавать временные файлы и код разрастётся до полноценного баш-скрипта

apl13

[winuser-mode]А их несколько?7777 :shocked:[/winuser-mode]

tokuchu

Дам ссылку для винюзеров:
http://en.wikipedia.org/wiki/Unicode_Transformation_Format#U...
:)

artimon

В конце поста указана UTF-8 :)

apl13

Просто в продуктах® Майкрософт™, так же как и один ANSI, есть лишь один Unicode to rule them all.
И это даже не UTF-16, по-моему, я не очень сильно этим интересовался.
У них вообще очень смешно получается следовать придумывать свои "стандарты".

Serab

В винде есть Unicode — это UTF16 LittleEndian с BOM без поддержки суррогатных символов (т.е. это фикс двухбайтовая кодировка)

apl13

Угу.
При этом только высшие маги знают, как убедить "консоль" не печатать в CP866.
Вернее, они не знают, у них случайно получилось.

doublemother

полноценного баш-скрипта
ORLY?
find $TREE -type f -exec iconf -f utf-8 -t cp1251 -o /tmp/mytmpfile {} \; -exec mv /tmp/mytmpfile {} \;

Нельзя называть полноценным башскриптом одну команду, которая пишется быстрее, чем пост на флокал.
Хотя ты же кажется из секты неосиляторов NM и pulseaudio...

Serab

ну убого же

doublemother

ну убого же
Твой выход?

yroslavasako

Твой выход?
http://joeyh.name/code/moreutils/
посмотри команду sponge. Но recode всё равно на мой взгляд удобнее

Dasar

В винде есть Unicode — это UTF16 LittleEndian с BOM без поддержки суррогатных символов (т.е. это фикс двухбайтовая кодировка)
Windows поддерживает 6 уникодных кодировок:
UTF-7, code page: 65000
UTF-8, code page: 65001
UTF-16, code page: 1200
UTF-16 Big endian, code page: 1201
UTF-32, code page: 12000
UTF-32 Big endian, code page: 12001
для файлов добавляется еще три кодировки: UTF-16 с преамбулой, UTF-32 с преамбулой и UTF-8 с преамбулой. Преамбула - это добавляемые в начало файла спец. тройка байтов, которые позволяет автоматически задавать вид кодировки: UTF8, UTF-16, UTF-16 BE, UTF -32, UTF-32 BE.
Под Ascii обычно подразумевают однобайтовую кодировку для заданного языка. Для русского - это кодировка 1251.
Для конвертации можно использовать PowerShell:
следующая строка конвертит файл из cp-1251 в utf8

$text = [System.IO.File]::ReadAllText("c:\temp\q1.txt", [System.Text.Encoding]::GetEncoding(1251));
[System.IO.File]::WriteAllText("c:\temp\q1.utf.txt", $text, [System.Text.Encoding]::GetEncoding("Utf-8"));

Serab

Windows поддерживает 6 уникодных кодировок:
UTF-7, code page: 65000
UTF-8, code page: 65001
UTF-16, code page: 1200
UTF-16 Big endian, code page: 1201
UTF-32, code page: 12000
UTF-32 Big endian, code page: 12001
в каком смысле она их поддерживает? Как в CreateFileW передать в каком-то определенном из этих юникодов?
Преамбула - это добавляемые в начало файла спец. тройка байтов, которые позволяет автоматически задавать вид кодировки: UTF8, UTF-16, UTF-16 BE, UTF -32, UTF-32 BE.
не обязательно тройка, зависит от кодировки. Там просто символ конкретный ставится в соответствующей кодировке, по нему можно ее определить
Под Ascii обычно подразумевают однобайтовую кодировку для заданного языка. Для русского - это кодировка 1251.
ASCII — это ASCII, под ним никто не понимает 1251. Под ANSI ты хотел сказать.

Dasar

в каком смысле она их поддерживает?
winapi содержит функции для работы с этими форматами
Как в CreateFileW передать в каком-то определенном из этих юникодов?
передать название? MultiByteToWideChar + CreateFileW
ASCII — это ASCII, под ним никто не понимает 1251. Под ANSI ты хотел сказать.
поддерживаю твою поправку

apl13

поддерживаю твою поправку
Надо было отклонить. Еще бы можно было подебатировать же.
Оставить комментарий
Имя или ник:
Комментарий: