vbali

<%= "addicted to code" %>

Response.Write() UTF-8

Elkezdtem fejleszteni a korábbi postomban már említett Helpdesk rendszert. Végül az ASP.NET mellett döntöttem, természetesen Apache-ra és Mono-ra támaszkodva.

Most kezdtem el megismerkedni az ASP.NET-el. C#-al kapcsolatban vannak már tapasztalataim, az ASP-t is ismertem egy-két korábbi munkám kapcsán, a kettő kombinációja pedig – köszönhetően a codebehind technikának – egy elég ütőképes páros mégha az ASP-t nem is szívlelem igazán (mindig is közelebb állt a szívemhez a PHP). Nem is ez most a lényeg…

Kezd szokásommá válni, hogy érdekes problémákba ütközök. Most is ez történt. Nagyjából összeállt a rendszer egy fontos dolog maradt hátra, az ékezetes karakterek rendbetétele, ugyanis a fejlesztés során folyamatosan ékezet nélkül drótoztam be a stringeket. Elkezdtem hát rendbetenni a szövegeket és ekkor érkeztem a fejlesztés “legfaramucibb” részéhez, ugyanis az asp lapok mögött lévő .cs fájlokban tárolt osztályok metódusaiban található Response.Write függvények (remélem követhető vagyok :-)) érdekes eredményt produkáltak. Az UTF-8 kódolású szövegeket hibásan jelenítette meg. Az ékezetek helyén kérdőjelek jelentek meg, ami valljuk be kissé zavaró. Minden beállítás megfelelőnek tűnt és az aspx állományokban lévő UTF-8-as stringek megfelelően kerültek a képernyőre még ha ott a

1
<% Response.Write(Árvíztűrőtükörfúrógép); %>

formát használtam is, csupán a metódusokból meghívott Response.Write()-ok produkáltak érdekes eredményt. 2 napig tartó Google-özés után sem jutottam eredményre, pedig több dolgot is kipróbáltam. Egy cseh csávó postjában találtam ugyanerre a jelenségre utaló nyomokat, de megoldást ott sem találtam. Tehát vagy én gizdáskodtam el valamit vagy pedig egy bug van a mono-ban.

Egyelőre úgy hidaltam át ez a problémát, hogy készítettem a rendszerhet tartozó MySql adatbázisban egy strings táblát és egy hozzá tartozó Helpdesk.Misc osztályt, benne egy GetText() metódussal:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public static string GetText(string StringID)
{
    IDataReader result;
    string retval = "";

    MySQL db = new MySQL();
    db.FastQuery("CALL sp_gettext('" + StringID + "')");
    if (db.FetchRow(out result))
    {
        retval = result["string"].ToString();
    }
    db.Close();
    if (retval.Length > 0)
    {
        return retval;
    }
    else
    {
        return StringID;
    }
}

A megoldás nagyon trágya, de működik! Ha valaki tud jobbat, ne kíméljen ossza meg velem!