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
<% 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!
13 Responses to Response.Write() UTF-8
MINDEN VÉLEMÉNY SZÁMÍT! Kilépés a válaszból
Fotók



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.
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!
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.
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?
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.
É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?
egy sima
<asp:Label ID=”titleLabel” runat=”server” Text=” />
is elég.
mondjuk nem natív mysql driverrel, hanem – lustaságból – odbc-vel
mármint
Text=’<%# Eval(“title”) %>’ />
mármint Text=< [százalék][hash] Eval(“title”) [százalék]>
na, ezt benéztem.
a text= természetesen egy mezőhöz kötve, Eval-lal
É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
[...] 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 [...]
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)