Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Πρόβλημα κωδικοποίησης

Îåêßíçóå áðü ôï ìÝëïò mendrinos. Τελευταία δημοσίευση από το μέλος mendrinos στις 30-12-2007, 12:11. Υπάρχουν 19 απαντήσεις.
Σελίδα 1 από 2 (20 εγγραφές)   1 2 >
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  21-12-2007, 17:50 38579

    Πρόβλημα κωδικοποίησης

    Έχω ανοίξει ένα windows hosting και προσπαθώ να μεταφέρω εκεί μια ήδη προγραμματισμένη ιστοσελίδα.

    Το πρόβλημά μου είναι ότι, ότι δεδομένα έρχονται από την ΒΔ (MS SQL 2005) εμφανίζονται με ?? δηλ λάθος κωδικοποίηση.

    Η ιστοσελίδα είναι σε iso-8859-7 και ότι δεδωμένα στατικά φαίνονται μια χαρά.

    Το ερώτημά μου είναι πώς μπορώ να ρυθμίσω τον sqloledb provider έτσι ώστε να φέρνει τα δεδωμένα από την βάση στην σωστή κωδικοποίηση? Υπάρχουν τίποτε extra παράμετροι στο sql connection string όπως πολλές φορές γίνετε με την MySQL?

    Δείτε το site πώς φορτώνει λάθος! :
    http://75.127.84.101/$sitepreview/kappa2000.gr/enimerosi.asp?nid=41

    Ευχαριστώ εκ των προτέρων για την βοήθειά σας.
  •  21-12-2007, 22:11 38584 σε απάντηση της 38579

    Απ: Πρόβλημα κωδικοποίησης

    Ο SQL Server δεν χρειάζεται τίποτε για να δουλέψει με τα ελληνικά - φτάνει να δουλεύεις με unicode και nvarchar πεδία. Δες και το Ο Sql Server ΔΕΝ ΧΡΕΙΑΖΕΤΑΙ κόλπα για να υποστηρίξει τα ελληνικά! Το γιατί εμφανίζονται ειδικά τα ?? το εξηγώ εκεί, αλλά χονδρικά κάποιος έγραψε σε varchar πεδία με ένα encoding και πήγε να το διαβάσει με άλλο.
    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  22-12-2007, 10:59 38589 σε απάντηση της 38584

    Απ: Πρόβλημα κωδικοποίησης

    Παναγιώτη Ευχαριστώ.

    Το θέμα είναι ότι εγώ είμαι php/mysql developer και δεν έχω καμία σχέση με .ΝΕΤ..

    Οπότε πιστεύεις πώς είναι καθαρά θέμα μέσα στον κώδικα και όχι σε τίποτε ρυθμίσεις?

    Πάντως μέσα στην Βάση Δεδωμένων απ'ότι κοίταξα έχουν όντως τα πεδία datatype nvarchar (με το n μπροστά). Απλά για κακή μου τύχη ο προγραμματιστής που έκανε αυτό το asp site τρέχουν οι σελίδες από τον IIS σε iso8859-7 και όχι σε UTF-8 που πιστεύω δεν θα υπήρχε το πρόβλημα.

    Σε αυτήν την περίπτωση τι επιλογές έχω?
  •  22-12-2007, 12:39 38593 σε απάντηση της 38589

    Απ: Πρόβλημα κωδικοποίησης

    Δες τη συζήτηση που έχει γίνει σε παρόμοιο πρόβλημα στο forum: "Ελληνικοί χαρακτήρες σε MSSQL ανεβασμένη σε hoster".

    Νομίζω ότι πρέπει να έχει λύση στο πρόβλημά σου...

     

    George J.


    George J. Capnias: Χειροπρακτικός Υπολογιστών, Ύψιστος Γκουράρχης της Κουμπουτερολογίας
    w: capnias.org, t: @gcapnias, l: gr.linkedin.com/in/gcapnias
    dotNETZone.gr News
  •  22-12-2007, 23:38 38597 σε απάντηση της 38593

    Απ: Πρόβλημα κωδικοποίησης

    Δυστυχώς δεν βγήκε τίποτε.

    Έτρεξα την εντολή:
    ALTER DATABASE db_name COLLATE Greek_CI_AS

    Αυτό που φαντάζομαι να συμβαίνει είναι το εξής:

    Ο sqloledb data provider βλέπει ότι η κωδικοποίηση του site είναι σε ISO-8859-7 και προσπαθεί να διαβάσει από την Unicode based βάση δεδωμένων.

    Άν υπάρχει κάποιος τρόπος, στο hosted αυτό περιβάλλον, να προσδιορίζουμε στον data provider (δηλ στον sqloledb) πώς θέλουμε να κάνει την σύνδεση και να φέρει τα δεδωμένα βασισμένος στην unicode κωδικοποίηση τότε θα έτρεχε απεικονίζοντας τους σωστούς χαρακτήρες.

    Τι λέτε;
  •  23-12-2007, 01:47 38599 σε απάντηση της 38597

    Απ: Πρόβλημα κωδικοποίησης

    Δεν έχει νόημα να πειράζεις το collation, γιατί εφόσον οι χαρακτήρες είναι ήδη σε μορφή Unicode δεν επηρεάζονται από αυτό. Μέχρι και τη στιγμή που το κείμενο της σελίδας σου στέλνεται στον browser (αφού δηλαδή ολοκληρωθεί η εκτέλεση του κώδικα σου) τα δεδομένα είναι σε μορφή Unicode (UTF-16). Εκείνη τη στιγμή μετατρέπονται στο encoding που ορίζεται στο web.config. Το πρόβλημα βρίσκεται στις σελίδες σου. Είπες στην αρχή ότι στο web.config είναι ορισμένο UTF-8 ενώ στις σελίδες είναι ISO-8859-7 (υποθέτω ότι εννοείς στο αντίστοιχο meta tag έχεις βάλει ISO-8859-7) . To λιγότερο, θα πρέπει και οι σελίδες να γίνουν UTF-8.

    Ρίξε πάντως μία ματιά στα δεδομένα της βάσης για να δεις σε τί μορφή είναι. Αν δεν εμφανίζονται σωστά ελληνικά υπάρχει η περίπτωση να έχουν καταστραφεί πριν καν αποθηκευτούν στη βάση. Αν για παράδειγμα τα στοιχεία εισάγονται από μία σελίδα η οποία έχει διαφορετικό codepage από αυτό που έχει οριστεί στο web.config μπορεί τα δεδομένα να φτάσουν κατεστραμμένα στη βάση. Το ίδιο επίσης μπορεί να συμβεί αν τα δεδομένα προέρχονται από άλλη βάση στην οποία υπήρχε λάθος collation (π.χ. ελληνικό κείμενο αποθηκευμένο σε βάση με Latin 1 collation).

     


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  23-12-2007, 02:09 38601 σε απάντηση της 38599

    Απ: Πρόβλημα κωδικοποίησης

    Ναι, τα δεδωμένα στην ΒΔ είναι σε unicode και χρησιμοποιουνται παντού nvarchar, από το webadmin βλέπω τα δεδωμένα της βάσης στα ελληνικά (σωστά).
    Το webadmin τρέχει UTF-8.

    To αξιοπερίεργο είναι πώς εγώ απλά κάνω restore την asp σελίδα από backups. Στον παλιό τον server: www.kappa2000.gr τρέχουν κανονικά τα δεδωμένα και η σελίδα είναι iso-8859-7.

    Υπάρχει κάποια μαζική διαδικασία μετατροπής των αρχείων asp σε UTF-8?
    Διότι άν αλλάξω απλά το meta-tag ότι στατικό ελληνικό κείμενο θα εμφανίζεται αυτό με την σειρά του λάθος.
  •  28-12-2007, 11:20 38666 σε απάντηση της 38601

    Απ: Πρόβλημα κωδικοποίησης

    Λοιπόν,

    Βρήκα κάτι λίγο ποιο διαφωτιστικό στο πρόβλημά μου:

    Όταν εκτελώ το παρακάτω κώδικα:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    <%@ Page Language="VB" Debug="true" %>
    <%@ Import Namespace="System.Data" %>
    <%@ Import Namespace="System.Data.SqlClient" %>
    <html>
    <title>Test</title></head>

    <body>
    <%
    Dim myDataReader as SqlDataReader
    Dim mySqlConnection as SqlConnection
    Dim mySqlCommand as SqlCommand


    mySqlConnection = new SqlConnection("server=<server>;user=<username>;password=<password>;database=db")
    mySqlCommand = new SqlCommand("SELECT * FROM Pages", mySqlConnection)
    mySqlConnection.Open()
    myDataReader = mySqlCommand.ExecuteReader(CommandBehavior.CloseConnection)


    Do While (myDataReader.Read())
    Response.Write(myDataReader.getString(1))
    Response.Write(myDataReader.getString(1) )
    Response.Write("<br/>")
    Loop

    ' Always call Close when done reading.
    myDataReader.Close()

    ' Close the connection when done with it.
    mySqlConnection.Close()
    %>

    Φορτώνει κανονικά τα ελληνικά από την ΒΔ!

    Όμως η εφαρμογή είναι προγραμματισμένη να χρησιμοποιεί:
    1
    2
    objConStr=application("sql_connection_string")
    Set objCon = Server.CreateObject("ADODB.Connection")

    Όπου τα ελληνικά χαλάνε...
    Υπάρχουν τίποτε ρυθμίσεις σχετικά με το ADODB που να σχετίζονται με το encoding?
  •  28-12-2007, 11:51 38667 σε απάντηση της 38666

    Απ: Πρόβλημα κωδικοποίησης

    Και εγώ το ίδιο πρόβλημα έχω σε ένα site που φτιάχνω σε php/mysql. Τα ελληνικά τα εμφανίζει: "????????????????".
    Τελικά στην php/mysql το έλυσες το πρόβλημα;
  •  28-12-2007, 12:07 38669 σε απάντηση της 38667

    Απ: Πρόβλημα κωδικοποίησης

    Τρέξε τα παρακάτω sqls:

    $query= "SET NAMES 'greek'";
    $result=mysql_query($query,$dbLink);
    $query="SET CHARACTER SET 'greek'";
    $result=mysql_query($query,$dbLink);



    Πώς έμπλεξα να μεταφέρω ένα ASP site απορώ.. ελπίζω να βρώ λύση...
  •  28-12-2007, 12:08 38670 σε απάντηση της 38669

    Απ: Πρόβλημα κωδικοποίησης

    OK, θα το δοκιμάσω σήμερα.

    Ευχαριστώ.
  •  28-12-2007, 12:13 38672 σε απάντηση της 38670

    Απ: Πρόβλημα κωδικοποίησης

    Και κάτι άλλο.

    Επειδή φτιάχνω ένα project-άκι σε jsp/servlets για έναν φίλο μου σε μια σχολή, μήπως ξέρεις πως μπορώ
    να διορθώσω το πρόβλημα και εκεί; Πάντως με encoding utf-8, windows-1253, iso-8859-7 δεν γίνεται τίποτα.

    Αξιοσημείωτο είναι το γεγονός ότι για mysql χρησιμοποιώ το xampp, οπότε το jsp-project βλέπει την Mysql από το xampp.
  •  28-12-2007, 12:41 38675 σε απάντηση της 38666

    Απ: Πρόβλημα κωδικοποίησης

    Μαααααα .... η CreateObject και το ADODB.Connection δεν έχουν σχέση με το ADO.NET και την ASP.NET! Έχει σχέση με την ASP και το ADO, τεχνολογίες ξεχασμένες από το 2002!

    Η CreateObject δημιουργεί ένα ActiveX αντικείμενο, στην περίπτωση σου το ADODB.Connection. Η κλάση αυτή καθώς και η ADODB.Command, ADODB.Recordset χρησιμοποιούνταν από την ASP και την VB6. Και αυτές υποστηρίζουν unicode, αλλά θέλουν περισσότερη προσοχή. Αν δούλευες σε VB6 πάλι δεν θα χρειαζόσουν να καρφώσεις πουθενά τη γλώσσα, στην περίπτωση σου όμως κάπου υπήρξε πρόβλημα κατά την μετατροπή από τον τύπο BSTR που χρησιμοποιεί το ADO σε .NET String. Τα πάντα εξαρτώνται από τον κώδικα που είχες γράψει (και δεν δίνεις εδώ).

    Έχω μερικές παρατηρήσεις για τον κώδικα σου πάντως. Η ASP.NET είναι αρκετά διαφορετική από την PHP και παρακάμπτει πολλούς από τους περιορισμούς της. Θα πρέπει να μάθεις πως δουλεύει το ADO.NET και η ASP.NET πρώτα για να αποφύγεις κάποια συνηθισμένα λάθη.

    • Καταρχήν, δεν χρειάζεται και ΔΕΝ ΠΡΕΠΕΙ να καρφώσεις το Connection String στον κώδικα σου. Είναι θέμα ασφάλειας αλλά και έτσι αποφεύγεις να ξανακάνεις compile τον κώδικα κάθε φορά που κάποιος αλλάζει το connection string. Κάθε web application έχει τα δικά του settings τα οποία αποθηκεύονται στο web.config. Στο Visual Studio τα βλέπεις μέσα κάνοντας δεξί κλίκ στο project σου και επιλέγοντας properties. Υπάρχει ειδικός τύπος setting για τα connection strings. Την τιμή των connection strings την βλέπεις πολύ εύκολα μέσω της global κλάσης Settings (στην C#, δεν θυμάμαι αν είναι η ίδια στην VB.NET).
    • Καλύτερα να χρησιμοποιείς Integrated Security παρά sql username και password. Είναι πάλι θέμα ασφάλειας καθώς έτσι δεν χρειάζεται να αποθηκεύσεις πουθενά το password του connection. Θα πρέπει όμως να προσθέσεις το account του application pool του site σου στον SQL Server. Το default είναι το "Network Service".
    • Αντί για χύμα SQL πρέπει να χρησιμοποιείς parameterized queries. Στην περίπτωση σου δεν περνάς καμμία παράμετρο, αλλά υποψιάζομαι ότι αν ήθελες να βάλεις ένα where θα το κόλλαγες απλά στο SQL string. ΚΑΚΟ. Κάτι τέτοιο θα σε άφηνε έκθετο σε SQL Injection attacks. Αν περνάς μία τιμή ως παράμετρο όμως ο κίνδυνος εξαφανίζεται. H PHP δεν υποστηρίζει parameterized queries, το ADO.NET όμως το επιτρέπει πολύ εύκολα. Και το παλιό ADO το επέτρεπε.
    • Αντί να κλείνεις το reader και το connection με το χέρι μπορείς να χρησιμοποιήσεις το Using keyword για να κλείσουν αυτά αυτόματα, ακόμα και σε περίπτωση exception. Τώρα δεν έχεις κανένα exception handler, οπότε αν συμβεί κάτι περίεργο θα ξεμείνουν ανοιχτά τα connection, reader.
    • Είναι προτιμότερο να φτιάχνεις σελίδες με code-behind κλάσεις παρά να ανακατεύεις στην ίδια σελίδα κώδικα και HTML. Τα πράγματα γίνονται πολύ πιο ξεκάθαρα έτσι.
    • Αντί να γράφεις τις τιμές του DataReader μία-μία μπορείς να χρησιμοποιήσεις ένα DataGridView ή κάποιο άλλο databound control για να δείξεις απευθείας τα αποτελέσματα του query. Έτσι θα έχεις πολύ καλύτερο έλεγχο στην HTML που δημιουργείται απ' ότι τώρα, θα έχεις υποστήριξη για CSS και άλλα καλούδια. Τώρα, πρέπει να είσαι σίγουρος ότι δημιουργείς σωστό HTML. Χρησιμοποιώντας ένα έτοιμο control, αυτό το αναλαμβάνει το control.
      Για να δεις πως γίνεται αυτό, φτιάξε ένα Data Connection στη βάση σου από τον Server Explorer και τράβα τον πίνακα pages επάνω στη φόρμα σου. Το Visual Studio θα δημιουργήσει αυτόματα τις κατάλληλες κλάσεις για να δείξει τα περιεχόμενα του πίνακα. Θα δεις ότι ο κώδικας είναι πολύ λίγος.

    Η ASP.NET δεν είναι PHP, έχει πολύ περισσότερες δυνατότητες. Θα πρέπει πρώτα να εξοικειωθείς με αυτή, και το ADO.NET πρωτού αρχίσεις να δουλεύεις με αυτή. Και "O SQL Server δεν θέλει κόλπα για να υποστηρίξει ελληνικά!"


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  28-12-2007, 15:58 38688 σε απάντηση της 38675

    Απ: Πρόβλημα κωδικοποίησης

    Παναγιώτη σε ευχαριστώ για το αναλυτικό αυτό post.

    Το θέμα είναι ότι δεν έχω προγραμματίσει εγώ αυτό το site, απλά έχω αναλάβει μόνο την μεταφορά του απο τον παλιό server σε έναν καινούριο.

    Και απλά το πρόβλημα είναι η κωδικοποίηση των δεδωμένων από την db που φαίνεται χαλασμένη.

    To site έχει ένα global.asa που εκεί υπάρχει το connection string και έχει ένα άλλο αρχείο στο οποίο φαίνεται να γίνεται όλη η δουλειά με την βάση.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    <%
    class RS_Data
        public pagesize
        public data
        public InitData
        public dataFields()
        public records
        public tot_Pages
        public Abs_Page
        public objConStr
        private objCon
        private objCmd
        public returnvalue
        private objRst
        private i
        private arrParams()
        private User_Name

        Private Sub Class_Initialize()
          pagesize = 10000
          Abs_Page=1
          objConStr=application("sql_connection_string")
          Set objCon = Server.CreateObject("ADODB.Connection")
          objCon.Open objConStr
          objCon.CommandTimeout=50
        End Sub

        public Function execSQL(sql)
              objCon.CommandTimeout=50
              Set objRst = Server.CreateObject("ADODB.Recordset")
              on error resume next
              objRst.Open sql,objCon,3,3
              if err.number <>0 then
              Response.Write sql
              Response.end
              end if
    ...

    Αυτό το site παίζει μια χαρά στον παλιό server! Δεν έχω πειράξει τίποτε στον κώδικα.

  •  28-12-2007, 16:00 38689 σε απάντηση της 38688

    Απ: Πρόβλημα κωδικοποίησης

    Το ερώτημα είναι αν υπάρχουν τίποτε extra ρυθμίσεις στον server που πρέπει να κάνω ώστε να παίξει σωστά αυτή η έστω πεπαλαιωμένη μεθοδολογία που χρησιμοποιεί.
Σελίδα 1 από 2 (20 εγγραφές)   1 2 >
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems