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ýstupní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), prekod14.zip - program+popis v1.4 (15kB)
prekod141.exe - program v1.4.1 (36kB), prekod141.txt - popis v1.4.1 (1kB), prekod141.zip - program+popis v1.4.1 (15kB)
prekod18.exe - program v1.8 (71kB), prekod18.txt - popis v1.8 (10kB), prekod18.zip - program+popis v1.8 (37kB)
prekod19.exe - program v1.9 (71kB), prekod19.txt - popis v1.9 (10kB), prekod19.zip - program+popis v1.9 (37kB)
57526a6516272842b4c6263df76ea3d66ff3ec4b prekod14.exe 6e4d1df7450360c291b74ee45dbd4a6068995e43 prekod14.zip 068af09e5ba88c32f977761e55cff331f74a65f6 prekod141.exe 39e85fedcd408fa38be8ca59ea1bc6ce8baf2da7 prekod141.zip 09e8010fc87f538005adddd5583938129ae7e257 prekod18.exe 17dd4d594bafb9bd2703112e644d35f45dc6199d prekod18.zip 2e74ef59591c5b612ebdfae6e1a4a7594c250850 prekod19.exe 3cbc962d22d90d3c4da7624be81e2464335f310f prekod19.zip
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