PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » Вопросы по PureBasic » UTF8 to ASCII


UTF8 to ASCII

Сообщений 31 страница 57 из 57

31

Andruk
Это у меня отработало в 2 раза быстрей, 13 против 26. Команда DisableDebugger активна, при правке её надо закомментировать, чтобы код был рабочий, потом раскомментировать чтобы провести тест времени.
А ещё вопрос, вырезатель картинок код наверно более актуальней <binary id="....</binary>.

Код:
;- TOP
EnableExplicit
DisableDebugger

;- # Constants
#SizeA = 1
#SizeU = 2

;- ● Define
Define StartTime
Define *s0
Define *a.ASCII
Define *u.Unicode
Define *mem
Define File$, idfile, idfile2, length, bytes, st$

File$ = OpenFileRequester("Выберите файл", "", "Книжка (.fb2)|*.fb2", 0)

StartTime = ElapsedMilliseconds()

If Asc(File$)
	idfile = ReadFile(#PB_Any, File$)
	If idfile
    idfile2 = CreateFile(#PB_Any, GetPathPart(File$) + "2.fb2", #PB_Ascii)
    If idfile2
    	length = Lof(idfile)
    	If length
        *mem = AllocateMemory(length)
        If *mem
        	WriteStringN(idfile2, ReplaceString(ReadString(idfile), "UTF-8", "windows-1251"))
        	bytes = ReadData(idfile, *mem, length)
        	If bytes
            st$ = PeekS(*mem, bytes, #PB_UTF8)
            *a = Ascii(st$)
            *s0 = *a
            *u = @st$
            While *u\u And *a\a
            	If *a\a = '?' And *u\u <> '?'
;                 *a\a = 0
                WriteData(idfile2 , *s0 , *a - *s0)
;                 WriteCharacter(idfile2, '&')
;                 WriteCharacter(idfile2, '#')
;                 WriteCharacter(idfile2, 'x')
                WriteString(idfile2, "&#x" + Hex(*u\u) + ";")
;                 WriteString(idfile2, Hex(*u\u))
;                 WriteCharacter(idfile2, ';')
                *s0 = *a + 1
            	EndIf
            	*a + #SizeA
            	*u + #SizeU
            Wend
            WriteData(idfile2 , *s0 , *a - *s0)
        	EndIf
        EndIf
    	EndIf
    	CloseFile(idfile2)
    EndIf
    CloseFile(idfile)
	EndIf
EndIf


StartTime = ElapsedMilliseconds() - StartTime
EnableDebugger
Debug StartTime

Отредактировано AZJIO (11.11.2025 04:12:17)

0

32

Я правильно понимаю, что речь идёт именно о простом перекодировании?
И почему не работать с документом как с xml в том числе для удаления необязательных атрибутов(*)?
И кажется есть зипованный FB2. Читалка его поддерживает?
http://www.fictionbook.org/index.php/Оп … 2_от_Sclex

(*) в том числе например переводы строк 0d0a и явно лишних пробелов.

p.s. это я к тому, что если простое перекодирование, то примитивно схематично без всяких циклов:

Код:
EnableExplicit
Define *buf, txt.s, fs.i
fs = FileSize("d:\down\1.fb2")
ReadFile(0, "d:\down\1.fb2")
*buf = AllocateMemory(fs)
ReadData(0, *buf, fs)
CloseFile(0)
txt = PeekS(*buf, fs, #PB_UTF8)
FreeMemory(*buf)
txt = ReplaceString(txt, "UTF-8", "WINDOWS-1251")
CreateFile(0,"d:\down\2.fb2")
WriteString(0, txt, #PB_Ascii)
CloseFile(0)

Отредактировано useful (11.11.2025 06:34:11)

0

33

AZJIO
Впечатляет... Очень.
Как многое мне предстоит еще познать.

Премного благодарен, буду изучать как это работает.

...код наверно более актуальней <binary id="....</binary>...

Да, конечно, так.

Отредактировано Andruk (11.11.2025 12:10:56)

0

34

useful написал(а):

...если простое перекодирование...

Не совсем простое - надо, чтобы не терялись символы, не входящие в win-1251.
Код AZJIO делает это в лучшем виде.

...зипованный FB2. Читалка его поддерживает?

Да, конечно. Просто для тестирования проще использовать не зипированный.

Отредактировано Andruk (11.11.2025 12:55:13)

0

35

AZJIO
А для картинок (jpg - обложка и иллюстрации) я делал так (на моем детском уровне):

Код:
UseJPEGImageDecoder() : UseJPEGImageEncoder()

If ReadFile(0, "2.fb2")
  sz = Lof(0)
  *buf = AllocateMemory(sz, #PB_Memory_NoClear)
  ReadData(0, *buf, sz)
  CloseFile(0)
  Xml.s = PeekS(*buf, sz, #PB_Ascii)     ; Если файл в win-1251
  FreeMemory(*buf)
  pos = FindString(Xml, "<binary")
  While pos
    pos = FindString(Xml, ">", pos)+1
    txt$=Mid(Xml, pos, FindString(Xml, "</binary>", pos)-pos)
    txt2$ = RemoveString(RemoveString(txt$, #CRLF$), " ")
    If Left(txt2$, 3)="/9j"
      size = StringByteLength(txt2$, #PB_Ascii) : If size < 64 : size = 64 :EndIf
      *buf = AllocateMemory(size, #PB_Memory_NoClear)
      Base64Decoder(txt2$,*buf,size)
      If CatchImage(1,*buf)
        FreeMemory(*buf)
        hg=ImageHeight(1)
        If hg>800
          pr.f=ImageWidth(1)/hg*800
          ResizeImage(1, pr, 800)
        EndIf
        *buf = EncodeImage(1, #PB_ImagePlugin_JPEG)
        txt2$ = Base64Encoder(*buf, MemorySize(*buf))
        FreeMemory(*buf)
        Xml = ReplaceString(Xml, txt$, txt2$, 0, pos, 1)
      EndIf
      k+1
    EndIf 
    pos = FindString(Xml, "<binary", pos+10)
  Wend
  If CreateFile(2, "3.fb2")
    WriteString(2, Xml, #PB_Ascii)   ; Если исх. файл в win-1251
    CloseFile(2)
  EndIf
  MessageRequester("", "Обработано: "+k+" шт.")
Else
  MessageRequester("", "Нет файла  1.fb2")
EndIf

В PB нет фильтров для jpg потому качество не очень, но в книгах главное буквы.
Картинки в формате png вообще не рассматривал - их жать лучше в сторонних спецпрогах.

Отредактировано Andruk (11.11.2025 12:04:21)

0

36

AZJIO
А не могли бы вы (если не трудно) кинуть в свой код пару-тройку комментариев - для тугодумов.
У меня с указателями какая-то путаница в башке.

Отредактировано Andruk (11.11.2025 13:01:49)

0

37

Код:
;- TOP
EnableExplicit
DisableDebugger

;- # Constants
#SizeA = 1
#SizeU = 2

;- ● Define
Define StartTime
Define *s0
Define *a.ASCII
Define *u.Unicode
Define *mem
Define File$, idfile, idfile2, length, bytes, st$

File$ = OpenFileRequester("Выберите файл", "", "Книжка (.fb2)|*.fb2", 0)

StartTime = ElapsedMilliseconds()

If Asc(File$)
	idfile = ReadFile(#PB_Any, File$)
	If idfile
    idfile2 = CreateFile(#PB_Any, GetPathPart(File$) + "2.fb2", #PB_Ascii) ; создаём и проверяем что создан (вдруг нет места или доступа или незаписываемый диск)
    If idfile2
    	length = Lof(idfile)
    	If length
        *mem = AllocateMemory(length) ; выдляем память по длине файла
        If *mem
        	WriteStringN(idfile2, ReplaceString(ReadString(idfile), "UTF-8", "windows-1251")) ; первую строку делаем замену
        	bytes = ReadData(idfile, *mem, length) ; читаем файл кроме первой строки, файловый указатель уже сдвинут
        	If bytes ; если прочитано сколько то байт, файл то может быть пустой
            st$ = PeekS(*mem, bytes, #PB_UTF8) ; читаем только полученное/прочитанное число байтов
            *a = Ascii(st$) ; запоминаем начало строки для Ascii буфера
            *s0 = *a ; указатель для начало строки между юникодными символами
            *u = @st$ ; запоминаем начало строки для Юникода буфера
            While *u\u And *a\a ; пока оба символа указателя чему то равны, то есть не конец строки, то
            	If *a\a = '?' And *u\u <> '?' ; если символ Ascii буфера равен "?", но при этом в той же позиции юникод не равен "?", то
;                 *a\a = 0
                WriteData(idfile2 , *s0 , *a - *s0) ; записываем данные от начала (или от сохранённого новой позиции) до первого найденного "?"
;                 WriteCharacter(idfile2, '&')
;                 WriteCharacter(idfile2, '#')
;                 WriteCharacter(idfile2, 'x')
                WriteString(idfile2, "&#x" + Hex(*u\u) + ";") ; записываем псевдокод
;                 WriteString(idfile2, Hex(*u\u))
;                 WriteCharacter(idfile2, ';')
                *s0 = *a + 1 ; сохраняем позицию начала нового куска строки
            	EndIf
            	*a + #SizeA ; сдвигаем указатель на следующий символ, на один байт
            	*u + #SizeU ; сдвигаем указатель на следующий символ, на два байта (в юникоде)
            Wend
            WriteData(idfile2 , *s0 , *a - *s0) ; записываем остаток до конца файла
        	EndIf
        EndIf
    	EndIf
    	CloseFile(idfile2)
    EndIf
    CloseFile(idfile)
	EndIf
EndIf


StartTime = ElapsedMilliseconds() - StartTime
EnableDebugger
Debug StartTime

+1

38

AZJIO
Спасибо!!!

0

39

И всё-таки, можно реальный пример таких символов в реальном документе не попавших в windows-1251 но при этом ВАЖНЫХ?
"На входе - текстовый файл с РУССКО-АНГЛИЙСКИМ текстом в кодировке UTF-8,
в котором встречаются символы, выходящие за рамки ASCII."

Я понимаю там какой то немецкий, шведский и проч., но русско-английский?

Отредактировано useful (11.11.2025 14:15:15)

0

40

useful написал(а):

Я понимаю там какой то немецкий, шведский и проч., но русско-английский?

Имелось в виду в основном русский, а теги на английском. В самом тексте могут встречаться разные там стрелки, звездочки,
ударение, слова на греческом, иероглифы и т.п., но основной (подавляющий) текст на русском. Как в любой художественной или
технической литературе на русском языке.

Например в Notepad++ строка в win-1251:
https://upforme.ru/uploads/0009/ae/28/775/787578.jpg

Та же строка в читалке:
https://upforme.ru/uploads/0009/ae/28/775/433672.jpg

Отредактировано Andruk (11.11.2025 15:09:05)

0

41

Понятно. По сути то же самое, что внедрение юникодных символов в однобайтовый не юникодный html.

Алиса:
Символы можно закодировать в числовом обозначении с применением десятичного (&#DD;) или шестнадцатеричного (&#xHHHH;) кода Unicode.
Правильный браузер будет отображать такие символы независимо от текущей кодировки документа, даже если она не может охватить эти знаки.

Отредактировано useful (11.11.2025 15:20:48)

0

42

Спасибо всем, начинаю углубляться в еще не постигнутое.

0

43

Andruk написал(а):

В PB нет фильтров для jpg потому качество не очень

В функции EncodeImage() качество задается в параметре Flags от 0 (худшее качество) до 10 (максимальное качество).

0

44

Пётр
По умолчанию 7 более-менее нормально выглядит, меньше - много хуже (на мой придирчивый взгляд).
Да дело даже не в степени сжатия, а очень часто в чрезмерных размерах картинки - бывают и 3000 пикселей по вертикали
и даже больше. Зачем - не понятно, ну разве что, если это какая-нибудь схема с мелкими деталями.

Отредактировано Andruk (11.11.2025 20:56:22)

0

45

Andruk написал(а):

в чрезмерных размерах картинки

ResizeImage() изменит размер до требуемого.

0

46

Пётр написал(а):

ResizeImage() изменит размер до требуемого.

Так и делаю - все, что больше 800 px по вертикали уменьшаю до этого размера (соблюдая пропорции) + сжатие с параметром 7.
Нормально получается, в полтора-два-три раза файл худеет. И качество картинок для книги вполне приемлемое.

Отредактировано Andruk (12.11.2025 00:07:26)

0

47

вот я про картинки не понял, на кой????
зачем тебе обложки???????
тебе читать или картинки???
выкинь их, и всё резко похудеет

0

48

newJS
я тоже имел это ввиду, выкинуть обложки, но потом вспомнил, что некоторые вставляют первую букву главы как букву на картинке нарисованную в сказочном виде. Если выкинуть на автомате с папкой книг, то как бы не испортить такие, хотя можно ведь догадаться по содержанию, что первая буква в начале главы пропущена. А что если книга в виде комиксов с небольшим количеством вставки, чтобы показать вид главного героя, без них тоже можно потерять общую атмосферу. Поэтому не буду голосовать ни за то ни за то. Можно исключительно глянуть контент и потом обработать, всё равно читать не один день, так что несложно просмотреть предположительно необходимые книги прежде чем провести обрезку. Я бы сделал так, прогнал папку с книгами, потом открыл бы в WinMerge обе папки для сравнения и кликал бы по файлам, тут было бы быстро, картинки бы создавали широкие полосы на предпросмотре, а замена букв создавала бы однопиксельные полосы. Или прогнать сначала удалением картинок, посмотреть в WinMerge сколько вырезано и чем оно является, а уж потом прогнать кодировщиком.

0

49

Совсем без обложки тоже нехорошо - какая-то книга неполноценная получается.
А картинки могут быть и частью повествования - как их можно выкинуть?
Для примера (из классики):
https://upforme.ru/uploads/0009/ae/28/775/t922089.jpg

Поэтому приходится удалять выборочно. Но это не так уж и часто бывает.

Отредактировано Andruk (13.11.2025 11:14:59)

0

50

давайте не будем путать обложку художественной книги и картинки спец книг
именно такие обложки имел ввиду, зачем она?
в своё время не одну сотню Fb2 перегнал в Txt и не заметил этого

0

51

fb2 без обложки как PureBasic без справки.

0

52

Предлагаю обложки посмотреть дома на компьютере, ведь обложка занимает пол книги. Ну скачал я файл размером 2,0Мб, вырезал обложку, стало 1,3, конвертировал текст, стало 0,7, вывод без обложки можно напихать в 2 раза больше книг. Кажется в этом был смысл.

0

53

Обложка высотой 800рх примерно около 50кб. Можно делать и меньше.
Для одиночного рассказа - много, для сборника рассказов или романа - не много. В среднем на 600-900 кб одной книги
будет приходиться 50кб обложки. Зато вид в каталоге библиотеки приличный.

0

54

newJS написал(а):

...перегнал в Txt...

Многое теряется: сноски, выделение (курсив, жирный), цитаты, стихи, эпиграфы, оглавление, заголовки, подзаголовки и т.д.
Читать такое - на вкус и цвет...

Отредактировано Andruk (14.11.2025 20:56:06)

0

55

Даже на телефонах памяти от 128Гб. Сто книг по 2Мб будут весить всего 200Мб. Я эту сотни книг буду года 3 читать. Поэтому против вырезания картинок. Нет, раньше тоже переделывал fb2 в txt, но только потому, что читалка kindle-4 (без перепрошивки) не понимает fb2. С появлением смартфона с олед-экраном читалку забросил.
п.с. Открыл для себя, что на телефоне книжки fb2 можно открыть читалкой встроенной в яндекс-браузер(!) и читать текст Алисой (есть и мужской голос). И читает она хорошо, с выражением, знает, где какие ударения и скорость настраивается. Все программные читалки (которые у меня были и есть) читают похуже, ошибаются с ударением, с паузами (даже со словарями ударений). Теперь можно комфортно слушать любую книгу, а не только ту, которую прочитал актёр." Работает даже на очень слабом инете. Читает лучше читалки от гугл, которая работает оффлайн.

0

56

Andruk написал(а):

Многое теряется: сноски, выделение (курсив, жирный), цитаты, стихи, эпиграфы, оглавление, заголовки, подзаголовки и т.д.
Читать такое - на вкус и цвет...

что может теряться в художественной книге?
откуда там все эти выкрутасы, там голый текст

0

57

bizdon написал(а):

Даже на телефонах памяти от 128Гб. Сто книг по 2Мб будут весить всего 200Мб. Я эту сотни книг буду года 3 читать. Поэтому против вырезания картинок. Нет, раньше тоже переделывал fb2 в txt, но только потому, что читалка kindle-4 (без перепрошивки) не понимает fb2. С появлением смартфона с олед-экраном читалку забросил

Я вот тоже не понимаю эти манипуляции.
Когда приходилось читать на Palm Pilot с 8 (восьмью) мегабайтами (не гигабайтами!) памяти, а ещё в этих мегабайтах размещались читалка и другие нужные программы, вот тогда приходилось извращаться, но даже при этом несколько книг помещалось.
А сейчас в читалку даже карту памяти не ставил, во внутренней всё помещается.
И даже в старый планшет дохрена книг влезет.

0


Вы здесь » PureBasic - форум » Вопросы по PureBasic » UTF8 to ASCII