stránky radioamatérské stanice
OK2PPK » Texty » Programy » Prekod (pro Win) | ---
offline program
v1.4 (2013/10), v1.4.1 (2018/8), v1.9 (2019/5), 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ě.
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í. Verze 1.9 opravuje pouze chybu v programu při záměnách znaků LF za sekvence CRLF nebo LFCR.
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 "prekod19.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 "prekod19.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
prekod14.exe - program v1.4 (36kB), prekod14.txt - popis v1.4 (1kB)
prekod141.exe - program v1.4.1 (36kB), prekod141.txt - popis v1.4.1 (1kB)
prekod18.exe - program v1.8 (71kB), prekod18.txt - popis v1.8 (10kB)
prekod19.exe - program v1.9 (71kB), prekod19.txt - popis v1.9 (10kB)
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.
v1.9 2019/5 - opravena chyba při náhradě znaku LF sekvencí LFCR nebo CRLF, kdy program občas zdánlivě náhodně havaroval