jump to navigation

Το σωστό encoding 15 Μαΐου 2006

Posted by Nikolas in .NET, Web Development, Windows.
Tags: , , ,
trackback

Αντιμετώπισα πρόσφατα ένα κλασσικό πρόβλημα. Μετέφερα μία βάση δεδομένων και μία web application από έναν server σε κάποιον άλλο. Για την ακρίβεια μετέφερα μία MySQL/PHP εφαρμογή από έναν Linux hosting provider σε έναν windows hosting provider.

Τί έγινε, μόλις τέλειωσα το Upload. Ο χαμός! Εκτός από τα χρώματα, όλα τα άλλα εμφανιζόντουσαν λάθος. Από PHP και MySQL δεν μπορώ να πω ότι κατέχω και ιδιαιτέρως (εντάξει δεν ξέρω, αλλά δεν το μαρτυράω), αλλά δεν άργησα να καταλάβω τί φταίει (και όχι δεν φταίει η αλλαγή από Linux σε Windows). Η νέα MySQL χρησιμοποιεί ως default encoding το latin1_swedish_ci (όπου ci Case Insensitive). Τα δεδομένα όμως μέσα στη βάση δεδομένων είχαν αποθηκευθεί ως greek (ISO 8859-7). Τέλος τα php χρησιμοποιούσαν ως template HTML αρχεία με δηλωμένο HTML encoding το ISO 8859-7 ωστόσο τα Connection Strings «τραβούσαν» τα δεδομένα από τη βάση με UTF-8.

Ωραίο μπάχαλο ε;!

Παλαιότερα, είχα ένα παρόμοιο πρόβλημα. Τα encodings μου στο ASPX ήταν σωστά, η βάση μου είχε σωστό Collation, αλλά μόλις τα ανέβασα στον provider, «μεταφράστηκαν» τα πάντα σε Κινέζικα.

Σήμερα, έπεσα πάνω σε ένα ερώτημα στο dotnetzone.gr, σχετικά με τα Ελληνικά και το σωστό encoding. Η φόρμα σωστή, το encoding σωστά δηλωμένο ως ISO 8859-7, αλλά μόνο οι Αγγλικοί χαρακτήρες «έφταναν». Οι Ελληνικοί έχαναν το δρόμο.

Πού θέλω να καταλήξω; Απλά να δώσω μια απλή και συνολική απάντηση σε όλα τα παραπάνω προβλήματα.

Ξεχάστε την εθνική υπερηφάνια, γιατί όσο και να λέμε ότι έχουμε δικό μας, κατά δικό μας προσωπικό εθνικό format, το ISO 8859-7 δεν τη κάνει σωστά τη δουλειά του. Ένα είναι λοιπόν το encoding και το όνομα αυτού Unicode Transformation Format – 8 ή UTF-8.

Σε ότι και αν κάνετε ΠΑΝΤΑ και ΜΟΝΟ αυτό το encoding να χρησιμοποιείται. Στο encoding της βάσης (η MS SQL έχει μία μικρή έλλειψη σε αυτό το θέμα, οπότε δηλώνετε ότι θέλετε στο collation), στο HTML encoding, στην XML, στο ASPX, ακόμα και κατά την αποθήκευση του αρχείου, πάντα να επιλέγετε UTF-8.

Και όλα τα προβλήματα θα χαθούν…

Ορισμένα παραδείγματα για τη δήλωση του σωστού (δηλ. UTF-8) encoding:

MYSQL:

@mysql_query(«SET CHARACTER SET ‘utf8′»)) και (@mysql_query(«SET NAMES ‘utf8′»)

MS SQL (είπαμε η MSSQL έχει μια μικρή έλλειψη, απλά δηλώνουμε multi-byte characters, γιατί χρησιμοποιεί Unicode):

ALTER TABLE Pinakas ALTER COLUMN Kolwna NVARCHAR(20)
και
INSERT INTO Pinakas VALUES(‘non_Unicode_Value’, Ν’Unicode_Value_N_makes_the_difference’).

HTML:

<meta http-equiv=»Content-Type» content=»text/html; charset=utf-8″>

XML:

<?xml version=»1.0″ encoding=»UTF-8″?>

ASP.NET:

<%@ Page Language=»C#» ContentType=»text/html» ResponseEncoding=»utf-8″ %>

WEB.CONFIG:

<?xml version=»1.0″ encoding=»utf-8″ ?>
<configuration>
<system.web>
<globalization requestEncoding=»utf-8″ responseEncoding=»utf-8″ />
</system.web>
</configuration>

Χρήσιμα Links

Σχόλια»

1. savvas - 2 Αυγούστου 2009

distixos oxi kai gia tin xml . ekei se polles periptoseis prepei na soseis to xml arxeio se unicode gia na deis ta ellinika sto flash soy para utf-8.

2. Μαρκος - 4 Αυγούστου 2009

φίλε μου σώσε με…..Έχω ένα xml driven html αρχείο και δε μου διαβάζει ελληνικά….Προσπάθησα με charset, προσπάθησα να το σώσω σαν unicode, τίποτα…Καμιά ιδέα?

Νικόλας Δ. - 5 Αυγούστου 2009

Δεν κάνεις ένα copy-paste τον header του αρχείου για να δώ τί εννοείς; Επίσης είναι απαραίτητο να γνωρίζουμε σε τί πλατφόρμα παίζεις, Windows ή Linux;

3. Μαρκος - 5 Αυγούστου 2009

Ορθή Επανάληψη:

HTML HEADER:

html
{
height:100%;
overflow: hidden;
}
body
{
margin:0px;
padding:0px;
background:#ffffff;
color:#000000;
height:100%;
}
#flashcontent
{
height: 100%;
}

var flashvars = {};
var params = {};
params.allowfullscreen = «true»;
params.allowscriptaccess = «always»;
var attributes = {};
attributes.id = «flashcontent»;
swfobject.embedSWF(«main.swf», «flashcontent», «100%», «100%», «9.0.0», false, flashvars, params, attributes);

XML HEADER:

Pro Template

0x111111

Νικόλας Δ. - 5 Αυγούστου 2009

Από το html λείπει η βασική δήλωση και από το XML η βασική δήλωση . Μάλλον κάτι δεν έχεις καταλάβει.

Από το τμήμα του HTML που έστειλες λείπει η δήλωση του CSS καθώς και της javascript.

Για το XML, το μόνο που μπορώ να πω είναι πώς αυτό που έγραψες δεν είναι XML, αλλά ένα απλό κείμενο.

Μάλλον κάτι έχεις μπερδέψει.

4. Μαρκος - 5 Αυγούστου 2009

Τώρα είδα ότι δεν μου τα κάνει σωστό paste.Αν έχεις κάποιο e-mail θα σου τα στείλω συνημμένα…Sorry για την ενόχληση.
Μάρκος

5. ama - 8 Μαρτίου 2010

Πως δηλώνουμε multi-byte characters στον ms sql server??


Σχολιάστε