Skip navigation

OK2RKB | ENG · GER · RUS · FRA · POL · HUN | Main · IE+ · IE- · Prn · Pda · CSSoff

OK2PPK » Texty » Programy » Prekod (pro Win) | ---

Prekod (pro Win)

offline program

Prekod (pro Win) - převod znakových sad

v1.4 (2013/10), v1.4.1 (2018/8), v1.8 (2018/9), konzolová aplikace Win32Api

autor OK2PPK

Program Prekod převede vstupní textový soubor z jedné znakové sady do jiné. Pokud není explicitně určeno jméno výstupního souboru, tak použije jméno vstupního souboru doplněné o příponu .PRE. Program umí provést vzájemné převody mezi kódováními ISO8859-2, CP852, CP1250, KEYBCS2 a UTF8. Primárně je určen na převod textů v českém jazyce (částečně lze obejít od verze 1.7 použitím uživatelských převodních tabulek).

Program pracuje s vnitřním mezipřevodem do UNICODE. Byl testován na převodu běžných českých textů, byla s ním (ve verzi 1.4) do UTF8 převedena z CP1250 řada stránek na tomto webu včetně několika materiálů z KEYBCS2 a při převodech jsem nenarazil na žádné znaky, se kterými by program měl problémy, resp. až po pěti letech používání jsem v roce 2018 potkal znak micro zapsaný v unicode nikoliv jako 0x00B5, ale jako 0x03BC, který se nepřeváděl a kvůli omezené velikosti převodních tabulek do nich nešel jednoduše doplnit. Při přepisu programu do nové verze 1.5 v roce 2018 jsem našel zapomenutou chybu v rutině pro převod znaků do UTF8, kde se kvůli chybnému nastavení mezí pro porovnávání špatně převáděly znaky 0x007F, 0x07FF a 0xFFFF. Tato chyba je opravená ve verzi 1.4.1, která je jinak funčně zcela shodná s verzí 1.4.

Verzi 1.4 (resp. 1.4.1) lze tedy považovat za prověřenou několika lety používání, nicméně doporučuji si zkontrolovat, zda převod proběhl korektně, a před převodem většího množství textů si raději nejprve na nějakém menším vzorku vyzkoušet, zda je vše překládáno správně.

Syntaxe v1.4.1 (v1.4):
  PREKOD ... vypíše nápovědu
  
  PREKOD k1 k2 soubor1 [soubor2] ... překóduje soubor1 do souboru2
  
    k1 - vstupní kódování (iso8859-2, cp852, cp1250, keybcs2, utf8)
    k2 - výstupní kódování (iso8859-2, cp852, cp1250, keybcs2, utf8)
    k1 a k2 musí být rozdílné
    soubor1 - vstupní soubor
    soubor2 - výstupní soubor (není-li zadán, tak se použije soubor1
              doplněný o příponu .PRE

  Příklad použití: prekod cp1250 utf8 infile.txt outfile.txt

Ve verzi 1.5 byl v roce 2018 program celý přepsán a byl změněn i používaný kompilátor. Do programu byla doplněna další kódování (KOI8čs, MACCE, ASCII, ALNUM, 256 a UTF16), program byl rozšířen o možnost změny způsobu odřádkování, práci s řídícími znaky a postupně ve verzi 1.6 a 1.7 i o práci s více soubory najednou a o podporu uživatelsky definovaných převodních tabulek.

Verze 1.7 tak poskytuje výrazně rozšířenou funkcionalitu, ale nebyla zatím prověřeně dlouhodobým používáním, ale pouze omezeným počtem vybraných testů. Nelze tak vyloučit, že v programu zůstala i nějaká fatální chyba, se kterou jsem se zatím nepotkal, případně že nedochází k úniku paměti její chybnou dealokací. Verze 1.7 má podstatně větší režii při spuštění než starší verze 1.4, používá více paměti a i samotný převod je složitější. Při převodech kratších souborů tak bude zřejmě pomalejší než starší verze. Ve verzi 1.7 je ale rychlejší způsob samotného převodu z unicode do 1bajtového kódování, takže při použití na delší soubory a při práci s více soubory na jedno spuštění může být naopak verze 1.7 rychlejší. Při testech na souboru s velikostí 100MB byla verze 1.7 při ukládání s i bez překladu přes výstupní tabulku zhruba stejně rychlá, v1.4 byla bez překladu přes výstupní tabulku asi o polovinu rychlejší než v1.7 a naopak s překladem přes výstupní tabulku byla přibližně dvakrát pomalejší než v1.7. Testovaný soubor obsahoval pouze znaky ze 7bit ASCII a testoval se na něm převod s nastavením z UTF8 na CP1250 a obráceně.

Verzi 1.7 tedy považujte za funkční, ale málo prověřenou. Protože tato verze umožňuje i přepisování vstupního souboru a práci s více soubory najednou, tak důrazně doporučuji s ní pracovat hodně obezřetně a jen na kopii dat a nejlépe v extra k tomu vyčleněném adresáři, tak abyste si vlastní chybou nebo chybou programu nechtěně a nevratně nepřepsali nějaký cenný soubor. Verze 1.7 zde byla nyní nahrazena novější verzí 1.8, ve které je doplněna možnost zobrazovat během zpracování průběžně počet načtených znaků, a ve které jsem dělal nějaké optimalizace u části podpůrných funkcí.

Syntaxe v1.8:
  PREKOD ?|-?|h|-h|help
  PREKOD helpfile
  PREKOD [options] codein codeout filein [fileout]

  ?|-?|h|-h|help ... vypsat nápovědu

  helpfile       ... nápovědu uložit do textového souboru "prekod17.txt"

  options .... volitelné parametry

  codein ..... vstupní kódování

  codeout .... výstupní kódování

  filein ..... vstupní soubor

               jméno souboru může být zadané i s cestou

               Pokud samotné jméno nebo přípona souboru obsahuje wildcards
               znaky * nebo ?, budou zpracovány všechny soubory z daného
               adresáře odpovídající zadané masce. Soubory, které byly při
               aktuálním zpracování nově vytvořeny nebo přepsány, se při shodě
               masky přeskočí a znovu se nezpracovávají.

               cesta nesmí obsahovat znaky wildcards * a ?

  fileout .... vystupní soubor, není-li zadán, tak se výstup uloží do souboru
               se jménem filein doplněným o příponu ".pre" nebo
               s příponou určenou volitelnými parametry ext nebo extchg

               jméno souboru může být zadané i s cestou

               Pokud filein neobsahuje znaky wildcards a fileout obsahuje
               retězec zakončený zprava znakem \ nebo :, tak řetězec bude
               použit jako cesta pro uložení výstupního souboru, jeho jméno
               pak bude shodné se vstupním s případnou změnou či doplněním
               přípony dle nastavení ext, extchg a extnochg.

               Pokud filein obsahuje znaky wildcards, tak se fileout
               vždy chápe jako cesta pro uložení výstupního souboru. Není-li
               zprava zakončena znakem \ nebo :, tak bude zprava doplněna
               znakem \. Jméno výstupního souboru bude shodné se vstupním
               s případnou změnou či doplněním přípony.

               fileout nesmí obsahovat znaky wildcards * a ? a cesta pro
               uložení souboru již musí existovat (nebude vytvořena)

  Povolené hodnoty vstupního (codein) a výstupního (codeout) kódování jsou:
  (v závorkách jsou uvedeny povolené alternativní zkrácené zápisy)

  iso8859-2 .. ISO Latin2, cp912
  (iso)

  cp852 ...... PC Latin2 DOS
  (dos)

  cp1250 ..... PC Latin2 WIN
  (win)

  keybcs2 .... Kamenický, cp895
  (kam)

  koi8cs ..... převážně jen české znaky z horní části tabulky C0-FF
  (koi)

  macce ...... MacOs CentralEurope
  (mac)

  256 ........ znaky 0x00-0xFF beze změny (převádí se transparentně
               na unicode 0x0000-0x00FF)

               Program pracuje s vnitřním mezipřevodem 1bajtových znakových
               sad do unicode. Pokud se provádí změny jen v odřádkování nebo
               v escapování řídících znaků, tak i při použití stejného codein
               a codeout bude převod proveden a v závislosti na nastavení
               převodních tabulek mohou být některé znaky změněny. Pro znaky
               0x00-0xFF je pak možné použít fiktivní sadu 256, která vnitřní
               mezipřevod neprovádí. Pro znaky 0x00-0x7F lze podobně použít
               i kteroukoliv jednobajtovou znakovou sadu iso8859-2 až macce,
               protože spodních 128 znaků se u těchto sad nemění.

  utf8    .... převážně jen znaky do hodnoty 024F plus asi 40 dalších při
  (u8)         převodu mezi unicode a 1 bajtovým kódováním, obecně zpracovává
               maximálně 4 bajtové sekvence utf8 a unicode znaky do 10FFFF

  utf16le .... little endián, unicode znaky do 10FFFF
  (u16)

  utf16be .... big endián, unicode znaky do 10FFFF
  (u16b)

  usr tbl .... uživatelsky definovaná překladová tabulka

               tbl je jméno souboru (případně i s cestou) ze kterého se má
               překladová tabulka načíst. Soubor s tabulkou je textový
               soubor, kde na každém řádku je dvojice hodnot oddělených
               čárkou:

               byte,unicode

               byte ...... znak z jednobajtového kódování (rozsah 0-255)
               unicode ... unicode znak (povolený rozsah jen 0-16383)

               byte a unicode musí být buď dekadické číslo nebo pokud
               začínají prefixem 0, tak v oktalovém tvaru, nebo při použití
               prefixu 0x v hexadecimálním tvaru

               řádky s chybným formátem se při načítání přeskočí s chybou,
               řádky začínající středníkem se přeskočí bez chyby

               pro vstupní tabulku dvojice znamená, že vstupní hodnota
               odpovídající byte bude převedena na hodnotu unicode, každou
               jedinečnou hodnotu byte má smysl použít jen jednou, při
               opakovaném výskytu bude rozhodující poslední přiřazená hodnota
               unicode, nepřiřazené hodnoty byte budou na unicode převáděny
               1:1, tj. 0->0, 1->1 ... až 255 -> 255

               pro vystupní tabulku dvojice hodnot znamená, že unicode znak
               bude převeden na odpovídající hodnotu byte, každou jedinečnou
               hodnotu unicode má smysl použít jen jednou a při opakovaném
               výskytu bude rozhodující poslední přiřazená hodnota byte,
               nepřiřazené hodnoty se překládají tak, že unicode znaky 0-255
               se převádí 1:1 na byte 0-255 a unicode znaky 256 a vyšší se
               se označí jako nepřeveditelný znak

               program tabulky používá tak, že údaje ze vstupního souboru
               převádí podle nastavení vstupního kódování do vnitřní
               reprezentace v unicode a podle nastavení výystupního kódování
               je pak z unicode převádí do výstupního kódování a ukládá
               do výstupního souboru

  Pouze pro výstupní (codeout) kódování lze dále použít hodnoty:

  ascii ...... 7bit ASCII (odstranění diakritiky)
  (asc)

  alnuml ..... ASCII, jen znaky a-z, 0-9, podtržítko, pomlčka, tečka
  (an)

  alnumu ..... ASCII, jen znaky A-Z, 0-9, podtržítko, pomlčka, tečka
  (anu)
               při převodu do alnuml a alnumu není převáděn znak \
               vkládaný při použití voleb esc a escall, defaultní znak ?
               označující nepřeveditelný znak ani jeho alternativa vybraná
               volbou errchar, bez použití voleb esc nebo escall nejsou též
               převáděny řídicí znaky 0x00-0x1F

  Volitelné parametry (options):

  norew ...... pokud vystupní soubor existuje, tak ho nepřepisovat

  rewask ..... pokud vystupní soubor existuje, tak se před přepsáním zeptat

  rewin ...... výstupem přepsat vstupní soubor

               vstupní soubor bude nejprve celý načten do paměti, uzavřen a
               následně budou data v paměti zpracována a uložena do původního
               vstupního souboru. Velikost takto zpracovatelných souborů
               je vnitřně omezena na 16MB. Při použití rewin se ignoruje
               nastavení fileout a volby ext, extchg a extnochg, jako
               výstup se vždy nastaví vstupní soubor.

  bom ........ pro utf8 a utf16 do fileout vždy vložit na začátek BOM, není-li
               uvedeno, tak se případný BOM z filein do fileout nepřenáší

  cr ......... změnit LF -> CR, CRLF -> CR, LFCR -> CR

  lf ......... změnit CR -> LF, CRLF -> LF, LFCR -> LF

  crlf ....... změnit CR -> CRLF, LF -> CRLF, LFCR -> CRLF

  lfcr ....... změnit CR -> LFCR, LF -> LFCR, CRLF -> LFCR

               není-li způsob odřádkování určen, tak se zachovává stávající,
               při použití v kombinaci s volbami escall a deesc se řádkování
               také nemění a volba cr|lf|crlf|lfcr je ignorována

  esc ........ řídicí znaky 0x00-0x1F (bez 0x0A a 0x0D, LF a CR nemění) uloží
               jako kombinaci znaku \ a znaku 0abftv (pro hodnoty 0x00,7,8,C,9,B)
               nebo (ostatní) ve tvaru \xHH, kde H je hexadecimální číslice

  escall ..... totéž co esc, navíc mění i LF (0x0A) a CR (0x0D) na \n a \r

  deesc ...... escape sekvence řídicích znaků nahrazuje znaky 0x00-1F

               při esc a escall budou též zdvojeny znaky \ na \\ a
               při deesc budou zdvojené sekvence \\ nahrazeny znakem \

  errchar c .. místo nepřeveditelných znaků vloží znak c (musí být z rozsahu
               0x20-0x7F), jinak bude vložen znak ?

  ext str .... místo defaultní přípony bude použit řetězec str

  extchg str . totéž co ext, ale přípona nebude přidána, ale nahradí se jí
               stávající přípona (pokud existuje, jinak se jen přidá)

               přípona se nahrazuje včetně úvodní tečky a v nové příponě
               je nutné případnou tečku explicitně uvést

  extnochg ... přípona výstupního souboru se nebude měnit (uplatní se pouze
               pokud se fileout zpracovává jako cesta, jinak se provede
               doplnění vstupního jména o defaultní příponu)

  logon ...... výpis chyb uložit do souboru "prekod17.log"

               implicitně se log uloží do adresáře, ze kterého se načítají
               vstupní soubory, nelze-li ho tam uložit, tak se použije
               aktuální adresář

  log filelog  výpis chyb uložit do souboru určeného retězcem filelog
  
  viewcnt .... na obrazovku vypisovat počet znaků načtených ze vstupního
               souboru (vypisuje se pouze pro každý milióntý znak)

  Příklady použití:

  prekod cp1250 utf8 infile.txt outfile.txt

  prekod esc extchg .pre cp1250 utf8 infile.txt

  prekod extchg -utf8.txt cp1250 utf8 *.txt

  prekod extnochg cp1250 utf8 *.txt c:\outdir\

  prekod rewin cp1250 utf8 *.txt

Stažení: prekod.exe - program v1.4 (36kB), prekod.txt - popis v1.4 (1kB)

prekod.exe - program v1.4.1 (36kB), prekod.txt - popis v1.4.1 (1kB)

prekod.exe - program v1.8 (71kB), prekod.txt - popis v1.8 (10kB)

Změny:

v1.0 1995/1 - výchozí verze, aplikace pro DOS

v1.1 1996/3 - aplikace pro DOS, doplněna možnost zpracování souborů DBF

v1.2 2013/5 - první verze pro WIN, konzolová aplikace pro Win32 API, oproti starším verzím 1.0 a 1.1, které byly napsány ještě v ASM pro DOS, je verze pro WIN napsaná v C a vnitřně má jiný převodní algoritmus, není již použita sada vzájemných konverzních tabulek, ale provádí se mezipřevod přes UNICODE. Verze pro WIN na rozdíl od starší verze pro DOS neumí převod DBF, nezná kódování KOI8čs a neumí odstraňovat diakritiku, naopak ale zná i iso8859-2 a UTF8.

v1.3 2013/7 - doplněno počítání chyb při čtení a převodu dat, opravena chyba ve vyhodnocování výsledku otevření výstupního souboru pro zápis - místo výstupního se kontrolovalo znovu handle vstupního souboru.

v1.4 2013/10 - zrychleno doplněním souborových V/V operací o vyrovnávací paměti

v1.4.1 2018/8 - opravena chyba v zápisu hodnot 0x007F, 0x07FF a 0xFFFF do UTF8

v1.5 2018/8 - přechod na kompilaci pomocí MinGW32, program od základu přepsán, doplněna kódování KOI8čs, MACCE, UTF16, 256, ASCII a ALNUM, doplněna možnost vložit BOM, měnit odřádkování a další nastavení a chování programu, zrychlen výstupní převod přechodem z vyhledávání na indexaci v tabulce. Výstupní překladová tabulka změněna tak, že nyní lze z unicode do 1bajtového kódování převést více než původních 128 znaků.

v1.6 2018/8 - opraveny všechny chyby, které se ve verzi 1.5 při testech podařilo nalézt, nyní by měl být program plně funkční. Doplněna možnost použít chybový log a rozšířeno o schopnost zpracovat více souborů v adresáři najednou.

v1.7 2018/9 - doplněna možnost přepsat výstupem vstupní soubor a pracovat s uživatelsky definovanými překladovými tabulkami.

v1.8 2018/9 - doplněna volba viewcnt pro zobrazení počtu načtených znaků při zpracování delších souborů, překompilováno s novějšími optimalizovanými interními moduly pro práci s řetězci, soubory aj.

Nahoru