Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в эту темуОткрыть новую тему
> utf-8 cp1251 сортировка файлов(фильтр)
FREEON
сообщение 5.1.2020, 14:44
Сообщение #1


*****

Journeyman
Сообщений: 365
Регистрация: 14.2.2017
Группа: Пользователи
Наличность: 1320
Пользователь №: 18.346
Возраст: 25



Кто знает программу, плагин, фильтр или способ сортировки текстовых файлов(массовый) по кодировке. Что бы например выбрал папку и там показывалось какой файл находится кодировке utf-8 или cp1251 или еще какой.
Массовая перекодировка различными программами не дает желаемого результата т.к. из перекодировки допустим из cp1251 в utf-8 будет норм вариант если этот файл в этой кодировке но если он был в ютф то при кодировке выдаст крокозябры. Поэтому и нужно точный фильтр который показал какой файл в какой кодировке изначально. Знаю к пилоту мало относится но есть ли разумное решения вопроса
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Fors1k
сообщение 5.1.2020, 15:56
Сообщение #2


*****

Journeyman
Сообщений: 497
Регистрация: 19.12.2017
Группа: Пользователи
Наличность: 2419
Пользователь №: 18.746



Код
dir (%res C:\2\txt *.txt*)
for #i 1 size(%res)
    set $arrp %res[#i 1]
    load_array %arr $arrp
    set $arr %arr[1 1]
    if copy($arr 1 3) = "п»ї"
        set #utf size(%utf) + 1
        set %utf[#utf] $arrp
        log UTF8_file #utf = %utf[#utf]
    else
        set #ansi size(%ansi) + 1
        set %ansi[#ansi] $arrp
        log ANSI_file #ansi = %ansi[#ansi]
    end_if
    set size(%arr)
end_for
end_script


--------------------
Для связиИзображение
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Cockney
сообщение 5.1.2020, 17:01
Сообщение #3


********

Master
Сообщений: 1.394
Регистрация: 22.6.2013
Группа: Пользователи
Наличность: 20894
Пользователь №: 16.156



Цитата
Поэтому и нужно точный фильтр который показал какой файл в какой кодировке изначально. Знаю к пилоту мало относится но есть ли разумное решения вопроса


Нет. Более-менее можно получить файлы которые находятся в utf кодировках. Все остальные кодировки можно определить лишь с какой-то долей вероятности, но точного метода нет.

Цитата(Fors1k @ 5.1.2020, 15:56) *

[code
if copy($arr 1 3) = "п»ї"
[/code]


bom может отсутствовать.
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
FREEON
сообщение 5.1.2020, 17:28
Сообщение #4


*****

Journeyman
Сообщений: 365
Регистрация: 14.2.2017
Группа: Пользователи
Наличность: 1320
Пользователь №: 18.346
Возраст: 25



Цитата(Cockney @ 5.1.2020, 17:01) *

bom может отсутствовать.

Ну да для теста создал 3 файла:
1-й ansi
2-й utf c BOM
3-й utf без заголовка

и результат из теста
Код

ANSI_file 1 = D:\5\new\1.html
UTF8_file 1 = D:\5\new\2.html
ANSI_file 2 = D:\5\new\3.html

То есть не совсем точно определяет.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 5.1.2020, 17:47
Сообщение #5


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26576
Пользователь №: 16.971
Возраст: 29



Цитата
То есть не совсем точно определяет.

Без bom utf8 от ansi можно отличить только если в тексте будут, например, русские символы. Тогда размер файла будет больше чем количество символов.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Fors1k
сообщение 5.1.2020, 18:06
Сообщение #6


*****

Journeyman
Сообщений: 497
Регистрация: 19.12.2017
Группа: Пользователи
Наличность: 2419
Пользователь №: 18.746



А что значит utf без заголовка?


--------------------
Для связиИзображение
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 5.1.2020, 18:19
Сообщение #7


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26576
Пользователь №: 16.971
Возраст: 29



Цитата
А что значит utf без заголовка?

Имеется ввиду без маркера последовательности байтов (Byte Order Mark, BOM).
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
FREEON
сообщение 5.1.2020, 18:33
Сообщение #8


*****

Journeyman
Сообщений: 365
Регистрация: 14.2.2017
Группа: Пользователи
Наличность: 1320
Пользователь №: 18.346
Возраст: 25



Цитата(Fors1k @ 5.1.2020, 18:06) *

А что значит utf без заголовка?

Есть разница в чем конкретно она не знаю(с заголовком bom в файле пару байт дописывается), но на деле как говорится результат на лицо. Например если использовать utf-8 без заголовка(без bom) то в некоторых браузерах русские символы будут отображаться криво. Если же использовать utf-8 c bom(с заголовком) то русские символы будут отображаться правильно. А ansi это чисто майкрасовтовская кодировка и тоже на других устройствах может криво отображаться. Но это все неточно я уже и сам запутался с этими кодировками и почему нельзя сделать одну универсальную для всех платформ.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 5.1.2020, 19:07
Сообщение #9


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26576
Пользователь №: 16.971
Возраст: 29



Если количество символов в файле не равно размеру файла, то это юникод.
Если равно ansi или uft8 без маркера, в котором только символы латиницы, цифры и знаки пунктуации. При этом он ничем он ansi не отличается.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 5.1.2020, 20:34
Сообщение #10


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26576
Пользователь №: 16.971
Возраст: 29



uft8 или ansi
Код
--lua
function utf ( path_to_file )
    local f = io.open(path_to_file, "rb")  -- открыть файл
    if f then   -- если открылся
        local s = ''
        for v in f:lines() do s = s .. v end   -- прочитать файл
        f:close()  -- закрыть файл

        if string.match(table.concat({s:byte(1, 3)}, ' '), "239 187 191")  then return 1 end   -- если есть bom uft8

        -- поиск русских символов в юникод
        for i = 144, 191 do
            if string.match(table.concat({s:byte(1, #s)}, ' '), "208 " .. tostring(i)) then return 1 end
        end
        for i = 128, 143 do
            if string.match(table.concat({s:byte(1, #s)}, ' '), "209 " .. tostring(i)) then return 1 end
        end
        return 0
    end
    return -1
end


local path = [[C:\123.txt]]  -- путь к файлу
local result = utf (path)  -- вызов функции
if result == 0 then log("ANSI") end
if result == 1 then log("UTF8") end
if result == -1 then log("Файл не найден") end
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 6.1.2020, 9:04
Сообщение #11


***********

Модератор UOPilot
Сообщений: 9.460
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27707
Пользователь №: 11.279



Цитата
for v in f:lines() do s = s .. v end -- прочитать файл

Если файл большой, то после такого чтения можно обнаружить седену и внуков =) Операция '..' достаточно тормознутая и зачастую приводит к повторному выделению памяти и полному копированию. В данном случае не очень понимаю смысла чтения по строкам. Почему не считать сразу весь?:
s = f:read("*a")
Если нужно считать все-таки строками, то лучше это делать через таблицу:
Код

s = {}
for v in f:lines() do
    s[#s+1] =  v
end
s = table.concat(s)


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 6.1.2020, 9:16
Сообщение #12


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26576
Пользователь №: 16.971
Возраст: 29



Цитата
s = f:read("*a")

Исправил.
код
Код
--lua
function utf ( path_to_file )
    local f = io.open(path_to_file, "rb")  -- открыть файл
    if f then   -- если открылся
        local s = ''
        s = f:read("*a")     -- прочитать файл
        f:close()  -- закрыть файл

        if string.match(table.concat({s:byte(1, 3)}, ' '), "239 187 191")  then return 1 end   -- если есть bom uft8

        -- поиск русских символов в юникоде
        for i = 144, 191 do
            if string.match(table.concat({s:byte(1, #s)}, ' '), "208 " .. tostring(i)) then return 1 end
        end
        for i = 128, 143 do
            if string.match(table.concat({s:byte(1, #s)}, ' '), "209 " .. tostring(i)) then return 1 end
        end
        return 0
    end
    return -1
end

log "clear"  log "mode compact"
local resultarray, count = dir ([[C:\]], "*.txt", "norecursion")  -- поиск txt файлов
log ("Найдено файлов: " .. count)

if count > 0 then
    for i=1, #resultarray do
        local result = utf ( resultarray[i][1] )  -- вызов функции
        if result == 0 then log("ANSI    " .. resultarray[i][1]) end
        if result == 1 then log("UTF8    " .. resultarray[i][1]) end
    end
end
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

Ответить в эту темуОткрыть новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия | Версия для КПК Сейчас: 29.3.2024, 18:35
Designed by Nickostyle