Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:



Unicode na W98

Seznam témat     Nová odpověď

Přihlásit se     Registrace     Zapomenuté heslo

Re: Špatne zobrazení

Autor: JiriValerian

7:44:09 09.04.2009

[color=#008000]TZD Napsal:
-------------------------------------------------------
> Díky nějakému viru mi win xp mi v některých
> programech nezobrazuje české znaky a nahrazuje je
> nečitelnými znaky. V "dosáckém" okně mi vypíše
> klikyhaky a -1250. Je možné že by mi ten "vir"
> změnil codepage nebo font v registrech a jak by se
> to dalo opravit?[/color]

Problém může být na mnoha místech včetně poškozených fontů atd.
Zkuste provést reinstalaci Windows, která by to měla opravit.

Citovat příspěvek

 

Špatne zobrazení

Autor: TZD

23:13:16 08.04.2009

Díky nějakému viru mi win xp mi v některých programech nezobrazuje české znaky a nahrazuje je nečitelnými znaky. V "dosáckém" okně mi vypíše klikyhaky a -1250. Je možné že by mi ten "vir" změnil codepage nebo font v registrech a jak by se to dalo opravit?

Citovat příspěvek

 

Re: Unicode na W98

Autor: JiriValerian

13:27:56 22.05.2008

[color=#008000]MK Napsal:
-------------------------------------------------------
> Vsechno hezky, ja ale musim hledani codepage a
> prevod udelat na jednom pocitaci a pak prenest
> retezec+codepage na cilovy pocitac
>
> Ale jinak dekuju. Drzim se varianty s vyctem
> konkretnich stranek. W98 mi jich funkci
> TranslateCharsetInfo urci 14 stranek, Visty 16.
> CreateFont ma preddefinovanych 18 charsetu,
> kterym zase muze odpovidat konkretnich 18
> stranek. Pokud se clovek podiva do zdrojaku
> W2000, najde tam nekolik tabulek, ktere pracuji
> prave s temahle 14-18 strankama.[/color]

Pokud nebudete převod codepage na charset na cílovém počítači s [b]Widnows 98[/b] realizovat pomocí funkce [b]TranslateCharsetInfo[/b], ale podle nějaké v programu pevně definované tabulky, pak by to snad neměl být problém a jediné co budete muset zajistit je to, aby na cílovém počítači s [b]Windows 98[/b] byly fonty s nimiž budete moci použít příslušný charset jinak se totiž text nezobrazí správně.

Pokud ovšem hodláte na cílovém počítači s [b]Widnows 98[/b] volat [b]TranslateCharsetInfo[/b] a jejím prostřednictvím si tam převádět přenesenou hodnotu codepage na charset tak v tom případě můžete mít problém, protože se Vám může stát, že některý cílový počítač s Windows 98 nebude podporovat příslušnou code page. Například u mě ve Windows 98 CZ je [b]z těch zmíněných 14 podporováno pouze 6[/b] codepage a pokud na takovém cílovém počítači zavoláte [b]TranslateCharsetInfo[/b] s hodnotou nepodporované code page pak funkce vrátí [b]FALSE[/b] tj. charset v takovém případě pomocí této funkce nezískáte.

Citovat příspěvek

 

Re: Unicode na W98

Autor: MK

12:54:45 22.05.2008

Vsechno hezky, ja ale musim hledani codepage a prevod udelat na jednom pocitaci a pak prenest retezec+codepage na cilovy pocitac.

Ale jinak dekuju. Drzim se varianty s vyctem konkretnich stranek. W98 mi jich funkci TranslateCharsetInfo urci 14 stranek, Visty 16. CreateFont ma preddefinovanych 18 charsetu, kterym zase muze odpovidat konkretnich 18 stranek. Pokud se clovek podiva do zdrojaku W2000, najde tam nekolik tabulek, ktere pracuji prave s temahle 14-18 strankama.

MK

Citovat příspěvek

 

Re: Unicode na W98

Autor: JiriValerian

10:51:16 22.05.2008

[color=#008000]MK Napsal:
-------------------------------------------------------
> Jinak receno jste potvrdil, ze 28592 se musi
> zkonvertovat do 1250 (jedne ze 14 stranek) aby se
> mohl pouzit charset 238.[/color]

Ale zde přece nebyla řeč o konvertovaní [b]NEUNICODE řetězce[/b] z jednoho code page na druhé, ale o konvertování [b]UNICODE řetězce[/b] do první nalezené code page do níž se vejde v souvislosti s rozsahem v tom UNICODE řetězci použitých znaků, alespoň tak jsem to pochopil z Vašich předchozích připomínek a tudíž na převod do code page 28592 vlastně nikdy nedojde, protože pokud začnete s těmi nižšími hodnotami code page jak jsem zmínil tak i když si ten cyklus s testováním přes [b]WideCharToMultiByte[/b] napíšete tak, že bude procházet všechny na daném systému podporované codepage viz níže příklad pro jejich výčet, tak v reálu na code page 28592 nikdy nedojde jelikož:

[b]1.[/b] Jednak platí to co jsem již zmínil tj. že 1250 pokrývá vše co je ve 28592 a tudíž pokud příslušný UNICODE řetězec bude splňovat předpoklady, že by byl převoditelný z UNICODE na code page 28592 tak bude současně splňovat i předpoklady, že bude převoditelný na code page 1250 a tudíž cyklus začínající od nižších čísel code page v takovém případě skončí dříve tj. už na code page 1250.

[b]2.[/b] A navíc když si při startu programu uděláte seznam na aktuálním systému podporovaných code page viz Win API funkce [b]EnumSystemCodePages[/b] tak se tomu ve [b]Windows 9x/Me[/b] vlastně zcela vyhnete díky tomu, že tato funkce dělá na těchto starších verzích Windows pouze výčet těch code page jejichž hodnota není vyšší než 4 cifry a tudíž Vám code page 28592 nikdy ve Windows 9x/Me nevylistuje.

[color=#008000]>> S tím seznamem 14 základních code page viz
>> již dříve uvedený odkaz bych doporučoval začít,
>
> A taky skoncit. Myslim, ze neexistuje stranka,
> kterou nemusim konvertovat do tech 14* stranek a
> bude zobrazitelna?[/color]

To nevím, ale podle mého názoru se není potřeba tím zatěžovat a stačí prostě udělat při startu programu výčet podporovaných code page na aktuálním systému viz příklad níže s tím, že si to uložíte třeba do vectoru a ten setřídíte od nejnižsích čísel k nejvyšším a pak při každém převodu nějakého UNICODE řetězce začnete v cyklu testovat přes [b]WideCharToMultiByte[/b] od nejnižšího čísla code page v tom seznamu a jakmile funkce [b]WideCharToMultiByte[/b] vrátí nenulovou hodnotu a současně nastaví hodnotu [b]FALSE[/b] v té [b]BOOL[/b] proměnné předávané v parametru [b]lpUsedDefaultChar[/b] a současně následné volání funcke [b]TranslateCharsetInfo[/b] vrátí [b]TRUE[/b] tak cyklus ukončíte a máte jak převedený řetězec v příslušné code page viz poslední volání [b]WideCharToMultiByte[/b] tak i platný charset pro ten font viz poslední volání [b]TranslateCharsetInfo[/b] tj. vše co jste zmínil, že potřebujete.

Z výše uvedeného je tedy zřejmé, že se v programu nemusíte zabývat žádným pevným definováním tabulky code page, jelikož budete vycházet z výčtu získaného vždy při startu programu viz níže jen ukázka výčtu s výpisem do konzole.

[size=14px][code][color=#0000FF]#include[/color] [color=#800080][/color]
[color=#0000FF]#include[/color] [color=#800080] [/color]
[color=#0000FF]#include[/color] [color=#800080] [/color]

BOOL CALLBACK EnumCodePagesProc [color=#800000]([/color]LPTSTR lpCodePageString[color=#800000])[/color]
[color=#800000]{[/color]
printf[color=#800000]([/color][color=#800080]"%s\n"[/color][color=#800000],[/color]lpCodePageString[color=#800000])[/color][color=#800000];[/color]
[color=#0000FF]return[/color] TRUE[color=#800000];[/color]
[color=#800000]}[/color][color=#800000];[/color]

[color=#0000FF]int[/color] main [color=#800000]([/color][color=#0000FF]void[/color][color=#800000])[/color]
[color=#800000]{[/color]
[color=#0000FF]if[/color] [color=#800000]([/color]EnumSystemCodePages[color=#800000]([/color]EnumCodePagesProc[color=#800000],[/color]CP_SUPPORTED[color=#800000])[/color][color=#800000])[/color] [color=#800000]{[/color]
printf[color=#800000]([/color][color=#800080]"OK\n"[/color][color=#800000])[/color][color=#800000];[/color]
[color=#800000]}[/color] [color=#0000FF]else[/color] [color=#800000]{[/color]
printf[color=#800000]([/color][color=#800080]"Chyba: %d\n"[/color][color=#800000],[/color]GetLastError[color=#800000]([/color][color=#800000])[/color][color=#800000])[/color][color=#800000];[/color]
[color=#800000]}[/color][color=#800000];[/color]
system[color=#800000]([/color][color=#800080]"pause"[/color][color=#800000])[/color][color=#800000];[/color]
[color=#0000FF]return[/color] [color=#0000FF]0[/color][color=#800000];[/color]
[color=#800000]}[/color][color=#800000];[/color][/code][/size]

Citovat příspěvek

 

Re: Unicode na W98

Autor: MK

6:46:55 22.05.2008

Jinak receno jste potvrdil, ze 28592 se musi zkonvertovat do 1250 (jedne ze 14 stranek) aby se mohl pouzit charset 238.

> S tím seznamem 14 základních code page viz již dříve uvedený odkaz
> bych doporučoval začít,

A taky skoncit. Myslim, ze neexistuje stranka, kterou nemusim konvertovat do tech 14* stranek a bude zobrazitelna?

* ve 14 strankach nejsou uvedeny CP_SYMBOL a CP_MACCP

MK

Citovat příspěvek

 

Re: Unicode na W98

Autor: JiriValerian

21:34:31 21.05.2008

[color=#008000]MK Napsal:
-------------------------------------------------------
> A ja uz myslel, ze jsem to pochopil :(
> Jaky charset se tedy pouzije napriklad pro
> codepage 28592 (ISO 8859-2 Central Europe)?
> TranslateCharsetInfo vraci FALSE.[/color]

[b]TranslateCharsetInfo[/b] vrací [b]FALSE[/b], protože code page [b]28592[/b] je podmnožinou code page [b]1250[/b]. Code page [b]1250[/b] totiž obsahuje všechny znaky code page [b]28592[/b] jen některé na jiných pozicích. Takže pokud se nějaký UNICODE text vejde při konverzi přes [b]WideCharToMultiByte[/b] do code page [b]28592[/b] musí se vejít i do code page [b]1250[/b] tj. bude beze ztráty konvertovatelný přes [b]WideCharToMultiByte[/b] i při použití code page [b]1250[/b].

Obecně se to tedy dá chápat tak, že pokud najdete pomocí [b]WideCharToMultiByte[/b] nějakou code page, ale [b]TranslateCharsetInfo[/b] Vám pro ni vrátí [b]FALSE[/b] pak to znamená, že je podmnožinou nějaké jiné code page, která teprve bude použitelná ke zobrazení a v takovém případě musíte pro stejný řetězec hledat další code page, pro kterou [b]TranslateCharsetInfo[/b] vrátí [b]TRUE[/b].

S tím seznamem 14 základních code page viz již dříve uvedený odkaz bych doporučoval začít, protože ty pokrývají i celou řadu dalších code page viz např. ve [b]Windows XP[/b] k tomu lze odvodit informace z hodnot v systémovém registru viz položky pod názvem [b]Family[/b] u jednotlivých podklíčů čísel code page v rámci klíče

[b]HKEY_CLASSES_ROOT\Mime\Database\Codepage\[/b]

Je tam vidět, že např. code page [b]28592[/b] patří stejně jako [b]852[/b] do rodiny code page [b]1250[/b] zatímco třeba code page [b]866, 20866, 21866 a 28595[/b] patří do rodiny code page [b]1251[/b] atd.

Citovat příspěvek

 

Re: Unicode na W98

Autor: MK

14:47:45 21.05.2008

A ja uz myslel, ze jsem to pochopil :(
Jaky charset se tedy pouzije napriklad pro codepage 28592 (ISO 8859-2 Central Europe)? TranslateCharsetInfo vraci FALSE.

MK

Citovat příspěvek

 

Re: Unicode na W98

Autor: JiriValerian

14:27:22 21.05.2008

[color=#008000]MK Napsal:
-------------------------------------------------------
> Mam to chapat tak, ze zatimco funkce
> MultiByteToWideChar a WideCharToMultibyte mi
> umoznuji delat konverze mezi asi 150 strankama,
> tak pokud chci neco v neUnicodu "dostat na
> obrazovku", musim to dostat do jedne ze 14 stranek
> uvedenych:[/color]

Ne to byl jen příklad.

Citovat příspěvek

 

Re: Unicode na W98

Autor: MK

12:31:52 21.05.2008

> Z obecného pohledu vidím ještě problém v tom, že UNICODE
Predpoklada se, ze text be se mel vejit do jedne stranky.

Mam to chapat tak, ze zatimco funkce MultiByteToWideChar a WideCharToMultibyte mi umoznuji delat konverze mezi asi 150 strankama, tak pokud chci neco v neUnicodu "dostat na obrazovku", musim to dostat do jedne ze 14 stranek uvedenych:

http://www.microsoft.com/globaldev/reference/WinCP.mspx

Jen drobna oprava, kdyby to nekdo zkousel:
if (TranslateCharsetInfo((DWORD*)CodePage,&Info,TCI_SRCCODEPAGE))

MK

Citovat příspěvek

 

Re: Unicode na W98 (doplnění)

Autor: JiriValerian

21:27:02 20.05.2008

Z obecného pohledu vidím ještě problém v tom, že UNICODE řetězec může obsahovat znaky spadající do několika různých ANSI sad a pak budete mít velký problém tj. v takovém případě nebude možné celý řetězec převést do jedné ANSI sady a tím to ani nebude možné jednorázově předávat té zmíněné funkci ZobrazTextA. V takovém případě bude vhodné nejprve rozsekat ten UNICODE řetězec na jednotlivé UNICODE znaky a každý samostatně převádět přes WideCharToMultiByte/TranslateCharsetInfo a tím najít odpovídající charset pro každý jednotlivý znak a pak to té zmíněné funkci ZobrazTextA předávat pouze po převedených částech z nichž každá bude sestavena z po sobě jdoucích znaků, pro které byl nalezen shodný charset.

Citovat příspěvek

 

Re: Unicode na W98

Autor: JiriValerian

18:51:49 20.05.2008

[color=#008000]MaK Napsal:
-------------------------------------------------------
> 1. Jak zjistit nejvhodnejsi codepage pro prevod?
> Zkusit vsechny a pouzit tu ktera se nejlepe
> osvedcila?[/color]

Pokud to má být obecné tak to bude asi problém tj. můžete zkusit zavolat pro aktuální UNICODE text [b]WideCharToMultiByte[/b] pro různé [b]code page[/b] s tím, že v parametru [b]lpDefaultChar[/b] budete předávat ukazatel na nějaký znak pro tzv. nahrazování za nenalezené znaky v dané code page a současně v parametru [b]lpUsedDefaultChar[/b] ukazatel na proměnnou typu [b]BOOL[/b]. Pokud bude po návratu z funkce [b]WideCharToMultiByte[/b] nastavena hodnota té [b]BOOL[/b] proměnné na [b]TRUE[/b] pak to znamená, že minimálně jeden znak z toho aktuálního UNICODE řetězce se nepodařilo převést na příslušný znak v rámci ANSI pro požadovanou code page. Můžete zkusit různé code page třeba v pořadí jak jsou uvedeny viz odkaz.

http://www.microsoft.com/globaldev/reference/WinCP.mspx

[color=#008000]> 2. jak k te codepage vybrat pro CreateFont vhodny charset?[/color]

Pomocí funkce [b]TranslateCharsetInfo[/b] viz odkaz a níže náznak jak by to mohlo jít realizovat.

[b]TranslateCharsetInfo[/b]
http://msdn.microsoft.com/en-us/library/ms776421(VS.85).aspx

[size=14px][code][color=#008000]// V dolnim WORDu v ramci DWORDu ulozit cislo code page [/color]
[color=#008000]// a horni WORD v ramci DWORDu ponechat nulovy[/color]
DWORD CodePage [color=#800000]=[/color] [color=#800000].[/color][color=#800000].[/color][color=#800000].[/color][color=#800000];[/color]
CHARSETINFO Info[color=#800000];[/color]
ZeroMemory[color=#800000]([/color][color=#800000]&[/color]Info[color=#800000],[/color][color=#0000FF]sizeof[/color][color=#800000]([/color]CHARSETINFO[color=#800000])[/color][color=#800000])[/color][color=#800000];[/color]
[color=#0000FF]if[/color] [color=#800000]([/color]TranslateCharsetInfo[color=#800000](([/color]DWORD [color=#800000]*)[/color]CodePage[color=#800000],[/color][color=#800000]&[/color]Info[color=#800000],[/color]TCI_SRCCODEPAGE[color=#800000])[/color][color=#800000])[/color] [color=#800000]{[/color]
[color=#008000]// pokud funkce vrati TRUE podaril se prevod [/color]
[color=#008000]// a v Info.ciCharset je charset odpovídajicí zadane code page[/color]

[color=#800000]}[/color][color=#800000];[/color]
[/code][/size]

Citovat příspěvek

 

Re: Unicode na W98

Autor: MaK

12:00:28 20.05.2008

Tim "Nemam k dispozici" jsem myslel, ze neni mozne pouzit. Berte to tak, ze jiz existuje funkce ZobrazTextA(const char *str, DWORD fdwCharSet), obejit ji nemuzu, jinak implementovat ji nemuzu a musim ji pouzit. Ale nemam ty dva parametry, ale jen unicodovy retezec.

fdwCharSet je shodny s fdwCharSet ve funkci CreateFont.

MK

Citovat příspěvek

 

Re: Unicode na W98

Autor: JiriValerian

11:22:35 20.05.2008

[color=#008000]MaK Napsal:
-------------------------------------------------------
> Mam unicode text neznameho obsahu a chci ho verne
> zobrazit na W98. Nemam k dispozici "Microsoft
> Layer for Unicode on Windows 95/98/Me Systems".[/color]

Tak si ho stáhněte a použijte při překladu své aplikace. Vždyť je stále volně ke stažení na serveru [b]Microsoftu[/b] viz odkaz. I když podpora Windows 9x/Me již skončila tak i přesto je řada věcí k těmto starším verzím Windows stále k dispozici. Stačí si je jen stáhnout a případně si k nim prostudovat doplňující info viz odkazy.

[b]Download: Microsoft Layer for Unicode on Windows 95, 98, and Me Systems[/b]
http://www.microsoft.com/downloads/details.aspx?FamilyID=73BA7BD7-ED06-4F0D-80A4-2A7EEAEE17E2&displaylang=en

[b]Info: The Microsoft Layer for Unicode on Windows 95/98/Me Systems[/b]
http://www.microsoft.com/globaldev/handson/dev/mslu_announce.mspx

[b]MSLU: Develop Unicode Applications for Windows 9x Platforms with the Microsoft Layer for Unicode[/b]
http://msdn.microsoft.com/en-us/magazine/cc301794.aspx

Knihovnu [b]Unicows.dll[/b] je povoleno distribuovat přímo s aplikací s tím, že si jen aplikaci přeložíte s [b]Unicows.lib[/b] a přihodíte k ní [b]Unicows.dll[/b] a máte vymalováno ;) v tom není žádný problém a je to mnohem lepší řešení než se plácat s nějakými problémovými převody ;).

Citovat příspěvek

 

Unicode na W98

Autor: MaK

8:04:10 20.05.2008

Mam unicode text neznameho obsahu a chci ho verne zobrazit na W98. Nemam k dispozici "Microsoft Layer for Unicode on Windows 95/98/Me Systems". Napada me pomoci WideCharToMultiByte prevest na MultiByte, vytvorit Font a zobrazit pomoci nejake TextOut. Ale:

1. Jak zjistit nejvhodnejsi codepage pro prevod? Zkusit vsechny a pouzit tu ktera se nejlepe osvedcila?

2. jak k te codepage vybrat pro CreateFont vhodny charset?

MK

Citovat příspěvek

 

 

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: