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

<% 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:

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!

Tagged with:
 

13 Responses to Response.Write() UTF-8

  1. moshi szerint:

    szia!

    ennek van már elegánsabb megoldása? nem tudok elszakadni a gondolattól, hogy ez csak valami kódolási beállítás lehet, legfeljebb nagyon eldugott helyen.

  2. vbali szerint:

    Mostanság .NET 2.0-ás alkalmazásokat fejlesztek/futtatok Mono-val és ez a hiba már nem jelentkezik a következő modosításokkal:
    1.) a web.config-ban a következő szerepeljen:
    <globalization
        responseEncoding="utf-8"
        fileEncoding="utf-8"
        requestEncoding="utf-8"
        culture="hu-HU"
        uiCulture="hu-HU"/>
    2.) Az egyes aspx állományok utf-8-ban legyenek elmentve! Ezt alkalmazva gond nélkül megjelennek az ékezetek!

  3. moshi szerint:

    az 1. pont rendben van, ha a másodikon azt értjük, hogy legyen benn a HEAD-ben egy META a charset=UTF-8-cal, akkor az is., a master page-be tettem.

    mégis csak kérdőjelek vannak az ő és az ű helyén.

    ráadásul windows 2003 szerveren fut.

  4. vbali szerint:

    Nem a charsetre gondoltam, hanem az állomány kódolására. Pl. notepad ‘save as…’ és ott van valami encoding ahol kiválasztható, hogy ‘Unicode (UTF-8)’ vagy vim esetén ‘:set encoding=utf8′

    Viszont ez Linuxos tapasztalat, de lehet, hogy Windows-on is megoldja, nem tudom. XSP-vel vagy IIS-el futtatod az oldalt?

  5. moshi szerint:

    na, most újat tanultam, de ez sem oldotta meg a problémát : )
    IIS-t használok egyébként a fejlesztéshez lokálisan, meg a web hosting szolgáltatómnál is az van.

  6. vbali szerint:

    Érdekes, nekem csak Linuxon jött elő ez a probléma, a Windows-on IIS-el vagy a VS development serverével futtatott kód nem okozott hasonlót.
    De neked is a ‘Response.Write’-ok okozzák a problémát vagy a MySQL-ből olvasott string-ek jelennek meg rosszul?

  7. moshi szerint:

    egy sima
    <asp:Label ID=”titleLabel” runat=”server” Text=” />
    is elég.

    mondjuk nem natív mysql driverrel, hanem – lustaságból – odbc-vel

  8. moshi szerint:

    mármint
    Text=’&lt%# Eval(“title”) %>’ />

  9. moshi szerint:

    mármint Text=< [százalék][hash] Eval(“title”) [százalék]>

  10. moshi szerint:

    na, ezt benéztem.
    a text= természetesen egy mezőhöz kötve, Eval-lal

  11. vbali szerint:

    Én a MySQL-Connector.NET-et használom. Azért, hogy Linuxon és Windowson is fusson az 1.0.8/9-es verziót. Esetleg tehetnél vele egy próbát, de itt már nagyon el lehet veszni a részletekben, mert a hibát okozhatja IIS, .NET, alkalmazás, MySql vagy ODBC. Szóval nem egyszerű a képlet. Bár véleményem szerint a MySql lesz a hunyó. De ez csak megérzés :-)

  12. [...] a hosszú ööö és üüü. kis szépséghiba, hogy csak lokálisan. nem az volt a probléma, ami Balázsnál, de ezúton is kösz a segítséget és a tippeket. (Atinak meg hogy fejből emlékezett egy egy [...]

  13. b. szerint:

    hi, mysql connect stringbe: charset=utf8; és select/insert is jo lesz, ha a *encoding is utf-8 a web.configban (ami mono 1.x es 2.x kornyezetben is ervenyes beallitas)

MINDEN VÉLEMÉNY SZÁMÍT!

Email cím (nem tesszük közzé) A kötelezően kitöltendő mezőket * karakterrel jelöljük

*

A következő HTML tag-ek és tulajdonságok használata engedélyezett: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="" highlight="">