Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno Hromadná záměna znaků v souborech

Mám několik txt_like souborů s texty v češtině, asi deset kousků. Pro potřeby vydání překladu potřebuji některé znaky s diakritikou změnit, aby následně odpovídaly překresleným fontům. Například, aby v české verzi bylo správně zobrazeno "ě", musím mít v textu "ê". Tech požadovaných transformací je docela dost,

Ě => Ê
Ů => Û
Č => Ç
Ď => Ð
Ň => Ñ
Ř => Ò
Š => Ø
Ť => Î
Ž => È
ě => ê
ů => û
č => ç
ď => ð
ň => ñ
ř => ò
š => ø
ť => î
ž => è

Dokážu tohle dělat po jednom písmenku (najít a nahradit), třeba Notepad++. Tam by mělo fungovat tohle nahrazení, pokud bych v něm otevřel více souborů najednou. Změním tím jedno písmenko ve všech otevřených souborech.

Je nějaká možnost, jak provést náhradu více písmenek v souboru v jednom kroku? Někam do programu nahrát "mustr", co změnit na co? V Notepad++ jsem to nenašel. Nebráním se samozřejmě použití jiného editoru. Pochopitelně, v souborech se nesmí měnit nic jiného, žádné taby, entery, formátování, délka.

Díky za případný tip.

Řešení:

To neumíš programovat nebo skriptovat? Příklad pro autoit:

Local $aArray [18][2] = [["Ě", "Ê"],["Ů", "Û"],["Č", "Ç"],["Ď", "Ð"],["Ň", "Ñ"],["Ř", "Ò"],["Š", "Ø"],["Ť", "Î"], _
["Ž", "È"],["ě", "ê"],["ů", "û"],["č", "ç"],["ď", "ð"],["ň", "ñ"],["ř", "ò"],["š", "ø"],["ť", "î"],["ž", "è"]]
Local $hSearch = FileFindFirstFile("in\*.*")
If $hSearch = -1 Then Exit
Local $sFileName = "", $iResult = 0
While 1
	$sFileName = FileFindNextFile($hSearch)
	If @error Then ExitLoop
	$hFileOpen = FileOpen("in\" & $sFileName)
	$sString = FileRead($hFileOpen)
	FileClose($hFileOpen)
	For $i = 0 To UBound($aArray) - 1
		$sString = StringReplace($sString, $aArray[$i][0], $aArray[$i][1],0,1)
	Next
	$hFileOpen = FileOpen("out\" & $sFileName,2)
	FileWrite($hFileOpen,$sString)
	FileClose($hFileOpen)
WEnd
FileClose($hSearch)

Toto ti projede všechny soubory ve složce in, nahradí všechny znaky a ty soubory uloží upravené ve složce out.

Předmět Autor Datum
PSPad to umí jako uživatelský konvertor. Nadefinuješ si co čím nahradit, podobně jako ten tvůj sezna…
Jan Fiala 03.04.2020 11:29
Jan Fiala
Ne, určitě to problém kódové stránky není není. Program není schopen pojmout více znaků, prostě čes…
L-Core 03.04.2020 11:37
L-Core
Není to úplně k věci, ale nějak to nechápu ... Přece v UTF8 můžu mít všecky ty diakritické znaky SOU…
dsa 03.04.2020 12:41
dsa
Neumí, na 100%. Jedná se o hru (nemohu být konkrétnější). Zjednodušeně: fonty nejsou ve formě třeba…
L-Core 03.04.2020 13:09
L-Core
Tak to poviem že hru vyvíjal retard. Btw, volá sa to "sprite" ne "mapa.
Mlocik97 03.04.2020 13:13
Mlocik97
Bohužel, tak je to ve velké většině her. Málokdy jsou automaticky dostupné všechny znaky ve všech ab…
L-Core 03.04.2020 13:18
L-Core
selfpromo... :-?
Mlocik97 03.04.2020 13:12
Mlocik97
A co jako? ::) Právě na JaFiho jsem spoléhal, že to třeba PSPad bude nějak umět. Možná to jde i v No…
L-Core 03.04.2020 13:14
L-Core
Replace Studio Pro spolu s utilitou srxConvert.zip (dole), která vytvoří seznam nahrazovaných znaků,…
Kyncl 03.04.2020 11:35
Kyncl
To neumíš programovat nebo skriptovat? Příklad pro autoit: Local $aArray [18][2] = [["Ě", "Ê"],["Ů"…
kacikac 03.04.2020 14:40
kacikac
Programovat neumím. Jsem rád, že (s pomocí) zvládnu složitější makra v Excelu. Každopádně díky, fun… poslední
L-Core 03.04.2020 16:56
L-Core

PSPad to umí jako uživatelský konvertor. Nadefinuješ si co čím nahradit, podobně jako ten tvůj seznam a pak to pustíš.
Ale není problém jen v tom, že ten soubor otevíráš se špatnou kódovou stránkou?

Pokud máš víc souborů najednou, je možné je překonvertovat hromadně, je na to připravený skript, který spustí konvertor na všechny otevřené soubory.
Konvertor by vypadal nějak takto (soubor uložit s příponou INI do podsložky .\Convertor):

;User conversion definition file for PSPad editor
[Settings]
ForwardName=Konverze do kódování pro hru
BackwardName=Konverze ze hry do čitelného

;ignore char case - it tells convertor to ignore char case in specific direction
ForwardIgnoreCase=0
BackWardIgnoreCase=0

ConversionStyle=strings

[Strings]
Ě|Ê
Ů|Û
Č|Ç
Ď|Ð
Ň|Ñ
Ř|Ò
Š|Ø
Ť|Î
Ž|È
ě|ê
ů|û
č|ç
ď|ð
ň|ñ
ř|ò
š|ø
ť|î
ž|è

Ne, určitě to problém kódové stránky není není.

Program není schopen pojmout více znaků, prostě české ěščřž atd nezná a neumí. Zato zná ty jiné znaky, tak musím substituovat. Fonty mám natvrdo překreslené, takže když v txt souboru bude "Ê", program to takto chápe a zobrazí písmenko na pozici Ê. A to mám překreslené na "Ě", takže to bude v programu zobrazeno správně.

Neumí, na 100%. Jedná se o hru (nemohu být konkrétnější).

Zjednodušeně: fonty nejsou ve formě třeba *ttf, ale ve formě jednoho obrázku, kde jsou prostě všechna použitelná písmenka namalované. Hra pak znaky bere podle souřadnic na tomto obrázku, na této "mapě".

Bohužel, tak je to ve velké většině her. Málokdy jsou automaticky dostupné všechny znaky ve všech abecedách. Pokud devs vydají hru v pěti jazycích, prostě si pohlídají, aby tam to bylo OK. Další neřeší.

Někdy mi devs pomohou, podporu (mi) poskytnou. Ale většinou si musíme pomoci sami a dát devs hotové řešení, které oni schválí. A nebo také devs ignorovat, ale já tohle nepraktikuji, chci mít vždy "požehnání".

To neumíš programovat nebo skriptovat? Příklad pro autoit:

Local $aArray [18][2] = [["Ě", "Ê"],["Ů", "Û"],["Č", "Ç"],["Ď", "Ð"],["Ň", "Ñ"],["Ř", "Ò"],["Š", "Ø"],["Ť", "Î"], _
["Ž", "È"],["ě", "ê"],["ů", "û"],["č", "ç"],["ď", "ð"],["ň", "ñ"],["ř", "ò"],["š", "ø"],["ť", "î"],["ž", "è"]]
Local $hSearch = FileFindFirstFile("in\*.*")
If $hSearch = -1 Then Exit
Local $sFileName = "", $iResult = 0
While 1
	$sFileName = FileFindNextFile($hSearch)
	If @error Then ExitLoop
	$hFileOpen = FileOpen("in\" & $sFileName)
	$sString = FileRead($hFileOpen)
	FileClose($hFileOpen)
	For $i = 0 To UBound($aArray) - 1
		$sString = StringReplace($sString, $aArray[$i][0], $aArray[$i][1],0,1)
	Next
	$hFileOpen = FileOpen("out\" & $sFileName,2)
	FileWrite($hFileOpen,$sString)
	FileClose($hFileOpen)
WEnd
FileClose($hSearch)

Toto ti projede všechny soubory ve složce in, nahradí všechny znaky a ty soubory uloží upravené ve složce out.

Zpět do poradny Odpovědět na původní otázku Nahoru