/ / Maximálny počet výstupov znakov z Win32 ToUnicode () / ToAscii () - windows, winapi, unicode, ascii

Maximálny počet znakov výstupu z Win32 ToUnicode () / ToAscii () - windows, winapi, unicode, ascii

Aký je maximálny počet znakov, ktoré by mohli byť výstupom z funkcií Win32 ToUnicode () / ToAscii ()?

Určite existuje rozumná horná hranica na to, čo môže vydávať virtuálny kód kľúča, kód kľúča skenovania a stav klávesnice?

odpovede:

2 pre odpoveď č. 1

Na mojom počítači so systémom Windows 8 USER32!ToAscii volá USER32!ToUnicode s vnútorným pufrom a. \ t cchBuff nastavený na 2. Pretože výstup ToAscii je a LPWORD a nie a LPSTR nemôžeme predpokladať nič o skutočných hraniciach ToUnicode z tohto vyšetrovania, ale to vieme ToAscii je vždy na výstup a WORD, Návratová hodnota vám povie, či 0, 1 alebo 2 bajty tohto WORD obsahuje užitočné údaje.

Prejsť na ToUnicode a veci sú trochu zložitejšie. Ak sa vráti 0, potom nebolo nič napísané. Ak sa vráti 1 alebo -1 potom bol napísaný jeden kódový bod UCS-2. Potom sme odišli s podivným 2 <= return výrazom. Môžeme sa pokúsiť rozobrať dokumentáciu MSDN:

Do vyrovnávacej pamäte boli zapísané dva alebo viac znakovzadaný pwszBuff. Najčastejšou príčinou tohto javu je, že znak mŕtveho kľúča (prízvuk alebo diakritika) uložený v rozložení klávesnice sa nedal kombinovať so zadaným virtuálnym kľúčom na vytvorenie jediného znaku. Vyrovnávacia pamäť však môže obsahovať viac znakov ako návratová hodnota. Ak k tomu dôjde, všetky ďalšie znaky sú neplatné a mali by byť ignorované.

Dalo by sa to interpretovať ako "dva alebo viac znakov bolo napísaných, ale iba dva z nich sú platné", ale potom by sa návratová hodnota mala zdokumentovať ako 2 a nie 2 ≤ value.

Verím, že v tejto vete sa dejú dve veci a mali by sme odstrániť to, čo nazýva „extra znaky“:

Vyrovnávacia pamäť však môže obsahovať viac znakov ako návratová hodnota.

To len znamená, že funkcia môže byť na vašej vyrovnávacej pamäti za hranicami toho, čo sa skutočne vráti ako platné. Potvrdzuje to:

Ak k tomu dôjde, všetky ďalšie znaky sú neplatné a mali by byť ignorované.

Toto nás necháva len s nešťastnou úvodnou vetou:

Dva alebo viac znakov boli zapísané do vyrovnávacej pamäte určenej pwszBuff.

Nemám problém si predstaviť návratovú hodnotu 2, môže byť tak jednoduchá ako základný znak kombinovaný s a diakritické ktorý neexistuje ako predkompilovaný kódový bod.

Časť „alebo viac“ by mohla pochádzať z viacerýchzdroje. Ak je základný znak zakódovaný ako náhradný pár, potom vás každý ďalší znak diakritického znamienka / kombinujúci znak posunie nad hodnotu 2. Na základnom znaku môže byť aj viac ako jeden znak diakritického znamienka / kombinujúci znak. Môže byť dokonca aj vedúca značka LTR / RTL.

Neviem, či je možné skončiť so všetkými3 podmienky v rovnakom čase, ale ja by som to hrať v bezpečí a určiť buffer 10 alebo tak WCHARs. To by malo byť v medziach toho, čo môžete produkovať na klávesnici s "jedným stlačením klávesy".

To nie je v žiadnom prípade konečná odpoveď, ale môže to byť to najlepšie, čo dostanete, ak niekto z Microsoftu neodpovie.