jump to navigation

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

Posted by Νικόλας in .NET, Web Development, Windows.
Tags: , , ,
7 Σχόλια

Αντιμετώπισα πρόσφατα ένα κλασσικό πρόβλημα. Μετέφερα μία βάση δεδομένων και μία 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

Advertisements