διαφορετικές κωδικοποιήσεις php

  1. Εκδότης
  2. x64 (aka andi)

οι συγγραφείς σεναριογράφων αρχαρίων δεν ενδιαφέρονται για κάτι τέτοιο όπως η κωδικοποίηση

οι συγγραφείς σεναριογράφων αρχαρίων δεν ενδιαφέρονται για κάτι τέτοιο όπως η κωδικοποίηση. Ως εκ τούτου, στις τοποθεσίες μπορείτε μερικές φορές να βρείτε ένα τρομερό χάος, όταν τα δεδομένα από τη βάση δεδομένων αποκτώνται σε μία κωδικοποίηση, η σελίδα σχηματίζεται σε μια άλλη, και ο διακομιστής έχει το τρίτο. ως αποτέλεσμα, αν η σελίδα μπορεί να αποκρυπτογραφηθεί, τότε τουλάχιστον 2 φορές. Λοιπόν, γιατί συμβαίνει αυτό το πρόβλημα και πώς να το ξεπεράσουμε;

στο ρωσικό τμήμα πιο συχνά μπορείτε να βρείτε τη λεγόμενη παράθυρο-κωδικοποίηση. καλέστε διαφορετικά: windows-1251, cp1251 ή ακόμα ansi. το επόμενο είναι utf-8. Μπορείτε επίσης να βρείτε το όνομα unicode, αλλά αυτό δεν είναι εντελώς σωστό, αφού το Unicode είναι το γενικό όνομα για ολόκληρη την ομάδα (utf-8, utf-16, utf-32). και μια πολύ δημοφιλής σπανιότητα είναι koi8-r ή απλά koi-8 - η κάποτε δημοφιλής κωδικοποίηση του Linux. Φυσικά, είναι δυνατό να συναντήσουμε κάτι άλλο στο ρωσικό τμήμα, αλλά αυτό είναι μάλλον μια "επιείκεια" από τον συγγραφέα.

Η κύρια διαφορά μεταξύ utf-8 και άλλων (κυρίως windows-1251 και koi8-r) είναι το τελευταίο byte και ο μέγιστος αριθμός χαρακτήρων που μπορούν να αναπαρασταθούν χρησιμοποιώντας αυτές τις κωδικοποιήσεις περιορίζεται σε 256. Είναι αυτονόητο ότι για μια πλήρη παρουσίαση του κειμένου αυτού μπορεί να μην είναι αρκετό. και για το html βρήκε μια λύση - τη χρήση των αποκαλούμενων μνημονικών. για παράδειγμα:

© - & copy;

Εκτός από το γεγονός ότι κάθε τέτοιος χαρακτήρας περιγράφεται από μια ομάδα χαρακτήρων, ο κώδικας καθίσταται ακατάλληλος και η εργασία με το κείμενο γίνεται πιο περίπλοκη. αυτό είναι που έρχεται στη διάσωση το multibyte utf-8. είναι πολύ βολικό να χρησιμοποιείτε γράμματα διαφορετικών αλφαβήτων και διαφορετικών συμβόλων σε ένα κείμενο.

Επομένως, το πιο άνετο σύνολο αρχικών συνθηκών είναι το εξής: η κωδικοποίηση της βάσης δεδομένων, των σεναρίων php και των σελιδοποιημένων σελίδων / js πρέπει να είναι ίδια. Φυσικά, μπορείτε να χρησιμοποιήσετε διαφορετικά, αλλά σε αυτήν την περίπτωση υπάρχει κίνδυνος να μπερδευτείτε. δεν έχει σημασία ποια σελίδα κώδικα χρησιμοποιείται. αν ο ιστότοπος είναι μόνο για ρωσόφωνους ακροατές, τα παράθυρα-1251 θα είναι αρκετά αρκετά. αλλιώς, το utf-8 θα ήταν η λογική επιλογή. η πρώτη επιλογή είναι περισσότερο ή λιγότερο σαφής. η πολυδικτυακή κωδικοποίηση θα απαιτήσει κάποιες χειρονομίες.

Όταν εργάζεστε με το utf-8, ένα τυποποιημένο σημειωματάριο σημειωματάριου δεν θα λειτουργήσει ! Το γεγονός είναι ότι αυτός ο συντάκτης, όταν αποθηκεύει ένα αρχείο σε αυτήν την κωδικοποίηση, προσθέτει μια υπογραφή στην αρχή - 3 χαρακτήρες, το λεγόμενο bom (byte order mark), το οποίο μπορεί να χρησιμοποιηθεί για τον προσδιορισμό της κωδικοποίησης κατά το άνοιγμα ενός αρχείου. είναι καλύτερα να επιλέξετε έναν άλλο επεξεργαστή: notepad2 ή σημειωματάριο ++ . στις ρυθμίσεις πρέπει να επιλέξετε να αποθηκεύσετε χωρίς υπογραφή.

Το επόμενο σημαντικό βήμα είναι η συνεργασία με τη βάση δεδομένων. Είναι πολύ επιθυμητό η κωδικοποίηση του πεδίου βάσης / πίνακα / κειμένου να αντιστοιχεί στην κωδικοποίηση δέσμης ενεργειών (θα μπορούσε να είναι cp1251 ή utf-8 ή κάτι άλλο). εάν τα δεδομένα από τη βάση δεδομένων αποκτώνται με τη μορφή "zyuk", πιθανότατα η κωδικοποίηση της σύνδεσης είναι διαφορετική από τα δεδομένα που είναι αποθηκευμένα στη βάση δεδομένων. Το παρακάτω ερώτημα θα σας βοηθήσει να ξεπεραστεί η κατάσταση (εκτελέστε αμέσως μετά τη σύνδεση με τη βάση δεδομένων):

αν ο ιστότοπος χρησιμοποιεί τα παράθυρα-1251, πρέπει να το ορίσετε - cp1251.

γενικά, δεν υπάρχει τίποτα δύσκολο. μόνο οι τυπικές λειτουργίες php δεν έχουν σχεδιαστεί για να λειτουργούν με χορδές πολλαπλών αρχείων. αλλά υπάρχουν και τυποποιημένες βιβλιοθήκες που θα βοηθήσουν να διορθωθεί η κατάσταση: iconv και mbstring . για κανονικές εκφράσεις, υπάρχει επίσης ένας απαραίτητος διακόπτης που ενεργοποιείται με τον τροποποιητή u .

Λοιπόν, τα δεδομένα από τη βάση δεδομένων αποκτώνται, τα σενάρια γράφονται σύμφωνα με όλους τους κανόνες. Απομένει να στείλετε τον σωστό τίτλο και να εμφανίσετε τον κώδικα σελίδας στο πρόγραμμα περιήγησης του χρήστη. στέλνουμε τον τίτλο έτσι:

κεφαλίδα ('Τύπος περιεχομένου: κείμενο / html; charset = utf-8');

εάν χρησιμοποιείται κωδικοποίηση με ένα byte, η τιμή για το σύμβολο θα είναι διαφορετική - windows-1251 . Μετά από αυτό, τα προβλήματα δεν θα πρέπει να παραμείνουν.

Μερικά απλά παραδείγματα εργασίας με utf-8 στο php:

παράδειγμα 1: iconv, αριθμός χαρακτήρων ανά γραμμή

$ s = 'συμβολοσειρά'; # συμβολοσειρά σε utf-8 $ cnt1 = strlen ($ s); # θα περιέχει την τιμή $ 12 cnt2 = iconv_strlen ($ s, 'UTF-8'); # σωστή τιμή, 6

παράδειγμα 2: mbstring, ο αριθμός των χαρακτήρων σε μια συμβολοσειρά

$ s = 'συμβολοσειρά'; # συμβολοσειρά σε utf-8 $ cnt1 = strlen ($ s); # θα περιέχει την τιμή $ 12 cnt2 = mb_strlen ($ s, 'UTF-8'); # σωστή τιμή, 6

παράδειγμα 3: κανονικές εκφράσεις, αναζήτηση και αντικατάσταση

$ s = 'Σειρά'; # γραμμή σε utf-8 $ s = preg_replace ('/ p / i', 'd', $ s); # αντικατάσταση δεν θα συμβεί $ s = preg_replace ('/ p / iu', 'd', $ s); # dock με αποτέλεσμα

ο τροποποιητής i καθορίζει την αναζήτηση ανιχνεύσιμων σε περίπτωση και ο τροποποιητής u λέει τη μηχανή κανονικής έκφρασης να λειτουργεί με αλυσίδες utf-8.

αν κάποιος λέει ότι το php δεν μπορεί να λειτουργήσει με utf-8, θα είναι λάθος. Επί σειρά ετών, έχω κάνει όλα τα έργα μου σε αυτή την κωδικοποίηση και δεν υπήρχαν καθόλου προβλήματα. Οι μηχανές αναζήτησης οι ίδιοι έχουν χρησιμοποιήσει από καιρό αυτή την υπέροχη κωδικοποίηση.

Εκδότης

offline 11 ώρες

x64 (aka andi)

Σχόλια: 2846 Δημοσιεύσεις: 395 Εγγραφή: 02-04-2009