.NET e CPP
.NET e CPP
In .NET il problema unicode non si pone perché il framework nativamente utilizza un encoding UTF16.
Il problema si pone quando il .NET deve interagire con il LUA e il C++ (tramite il LUA). Per poter risolvere questo problema abbiamo modificato VBLUANET per poter gestire il nostro userdata. Questo è stato necessario perché quando chiamiamo un metodo .NET che ritorna una stringa da uno script LUA, vbluanet esegue un cast automatico nel tipo nativo lua perdendo la corretta formattazione della stringa.
Il primo problema da risolvere è fare in modo che il .NET possa restituire non una stringa nativa ma il nostro userdata “lua_stringw”. Questo è possibile definendo un tipo .NET che sia un “wrapper” del nostro userdata “lua_stringw”.
Il tipo Stringw
Abbiamo quindi definito il tipo .NET “Stringw” derivato dalla classe base “LuaRefWrapper” che si occupa di gestire i riferimenti dello userdata nello stack del LUA. Questo oggetto prevede una factory che consente di generare “Stringw” a partire da una stringa .NET. Quindi in .NET è possibile ritornare al lua la nostra stringa unicode. Quindi dove fosse richiesto di ritornare una stringa unicode da .NET a LUA si può usare questo sistema.
Chiamate a metodi o proprietà esistenti
Il secondo problema è fare in modo che un client LUA possa chiamare un metodo o una proprietà di un tipo .NET senza dover definire un metodo o una proprietà apposito dal lato .NET. Il problema è facilmente risolvibile tramite vbluanet. Se il metodo o la property chiamato termina con il suffisso “_uni” vbluanet “capisce” che è stata richiesta la versione unicode del metodo/proprietà. In questo caso rimuove il suffisso, esegue la chiamata nativa, prende la stringa di ritorno la converte in userdata “lua_stringw” e la ritorna al LUA.
Esempio.
-- creazione di una persona (dimitri)
local p = Persona(_U("Дмитрий"))
-- nome come stringa LUA (NO)
local nome = p.Nome
-- nome come stringa UTF-8 (SI)
local nome = p.Nome_uni
Se il metodo prevede di ricevere in ingresso una stringa è possibile passare una stringa unicode LUA. Vbluanet provvede alla conversione automatica.