Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Στήνουμε έναν σερβερ με λογισμικο Windows 2012 r2  και υαρχουν 2 θεματακια που σχετίζονται με τις γλωσσες

 

Πρωτον

παω Control Panel > Language επιλεγω Add a Language κατεβαζει/εγκαθιστα Ελληνικα τα οποία και αφηνω ως δευτερευουσα γλωσσα.  Τωρα όμως οι διαθέσιμες γλωσσες είναι 3 (κοιταξτε και την εικονα)

ENG αγγλικα

ΕΛ US ελληνικα με αγγλικο πληκτρολογιο (!) δηλαδή πατας alt+shift να αλλαξει γλωσσα, σου δειχνει ελ us αλλα γραφει ακομα αγγλικούς χαρακτηρες

ΕΛ EL ελληνικα

 

alt+shift αλλαζει μονο μεταξυ ENG κα ΕΛ US, για τα EΛ EL πρεπει να πας να τα επιλεξεις με το ποντικι

 

τι πατατα είναι αυτή ρε παιδια? και πως βγαζω την EΛ US όταν στο language μου εχει μονο 2? αγγλικα και ελληνικα?

 

 

//

 

Δευτερον

 

για upload αρχειων με ελληνικους χαρακτήρες στο τιτλο του, εχουμε αυτή την php μαζι με την συναρτηση iconv να κανονιζει αλλαγες μεταξυ code pages. Για να δω το code page του Server χτυπάω chcp στη command Line και μου απανταει 437. Οποτε βαζω την iconv ετσι

move_uploaded_file($_FILES["file"]["tmp_name"],"upload/" .$randomString .  iconv('UTF-8', 'cp437', $_FILES["file"]["name"]));

Το αρχείο εχει ονομα wwwθεα.

Στη βαση είναι κανονικα wwwθεα.jpg

Στον φακελο είναι www και αναφέρεται απλα ως file, όχι ως jpg

Στο σαιτ ερχεται ετσι με status code 404 not found προφανως.

 

Τι γινετε ρε παιδια?

 

Ευχαριστω πολύ

(Ps μα επιτελους καλο μου, πως ανεβαζω μια εικονα?)

Request URL:
http://μπλαμπλα.τζιαρ/upload/www%CE%B8%CE%B5%CE%B1.jpg
Δημοσ.

Το πρώτο θέμα σου είναι τελείως άσχετο με προγραμματισμό και θα ήταν καλύτερα να το ρωτήσεις σε πιο κατάλληλο forum. Θα το δουν και περισσότεροι.

 

Όσον αφορά το αρχείο μέσες άκρες αυτό που θέλεις "δε γίνεται" σε Windows γιατί τελικά τα πάντα καταλήγουν στο πώς τα windows θα επιλέξουν να διαβάσουν το filename που τους περνάς (το οποίο σε κείνη τη φάση δεν είναι παρά ένα μάτσο bytes).

 

Αν δε με απατά η μνήμη μου, φτιάχνοντας την κλήση στην iconv (το σωστό charset είναι "windows-1253", τα codepage της κονσόλας δεν έχουν καμία σχέση) και επιπλέον βάζοντας τη ρύθμιση γλώσσας των windows για non-unicode programs στα ελληνικά θα πρέπει να σου δουλέψει. Αλλά επειδή αυτό το τελευταίο παίρνει μπάλα τα πάντα στο σύστημα (θέλει reboot για να το αλλάξεις!), και επειδή ακόμα και τότε θα έχεις πρόβλημα με ονόματα αρχείων σε άλλες γνώσσες, γενικά δεν είναι λύση.

 

Αυτό που θα έπρεπε να κάνεις είναι να έχεις κάτι σε database όπου αποθηκεύεις τα αρχικά ονόματα και όποτε χρειαστεί ανατρέχεις εκεί για να δεις ποιό είναι αυτό που θες. Όσον αφορά την αποθήκευση στο server (move_uploaded_file) θα χρησιμοποιήσεις randomized λατινικά ονόματα.

Δημοσ.

@defacer Thanks. Εχεις δικιο για το "windows-1253"

 

Θελει

-"windows-1253" στην iconv

-Control Panel > Region > Administrative > Change System Locale > επιλεγουμε Greek Και κανουμε και reboot

-Εγκαταστηστε και τα ελληνικα σα 2η γλωσσα αν δεν υπαρχει (με τον τροπο που ειπα στο αρχικο ποστ)

 

με αυτά τα παραπανω δουλεψε σε μενα.

 

Προσοχη

ο defacer εχει δικιο, δεν είναι απολυτως σωστη η λυση. Εγω την αποδεχομαι ως σωστη επειδή σ αυτό που φτιαχνω τωρα εικονες σε αγγλικα κ ελληνικα θα ανεβαζουν -και θα το χειρίζονται ελληνες. Τωρα αν βρεθει ενας τρελος να ανεβασει εικονα με τιτλο στα τζαινιζ μανταριν....ε ας προσεχε. Αν βρεθουν πολλοι...θα αλλαξω την ονοματοδοσια σε random string αγγλικων

 

Μια ερωτηση ακομα....αφου το command Line Μου λεει 437 , γιατι το σωστο είναι "windows-1253"; Ποια η διαφορα?

 

Να σημειωσω και ένα random string generator σε PHP για οποιoν το χρειαστεί

$randomString = substr(str_shuffle("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0, 10);
Δημοσ.

Μια ερωτηση ακομα....αφου το command Line Μου λεει 437 , γιατι το σωστο είναι "windows-1253"; Ποια η διαφορα?

 

To code page στην κονσόλα είναι για ιστορικούς λόγους (συμβατότητα με MS-DOS) διαφορετικό από αυτό που ισχύει για τις εφαρμογές αυτές καθαυτές και βασικά δεν παίζει κανένα απολύτως ρόλο εκτός από όταν χρησιμοποιεί κανείς συναρτήσεις σαν τη WriteConsole (όχι απαραίτητα άμεσα, αν γράψεις ένα πρόγραμμα C που κάνει printf, η C runtime library που έχεις κάνει link μαζί με τον κώδικά σου και η οποία υλοποιεί την printf στο τέλος θα κάνει WriteConsole).

 

Γιατί το σωστό είναι το 1253: επειδή κατ' αναλογία με την printf() που λέω, κάποια στιγμή η move_uploaded_file

 θα καλέσει ας πούμε τη fopen [php] η οποία με τη σειρά της θα καλέσει την fopen [C runtime μιας και η PHP είναι γραμμένη σε C] η οποία με τη σειρά της θα καλέσει την CreateFile [του win32 API, η οποία δε μας νοιάζει πλέον πώς υλοποιείται] για να γίνει η δουλειά που πρέπει.

 

Αν τώρα κάνεις πολύ scroll down στην τεκμηρίωση της CreateFile θα δεις ότι στο τέλος κάπου λέει

 

Unicode and ANSI names

CreateFileW (Unicode) and CreateFileA (ANSI)

 

Αυτό σημαίνει ότι, όπως και όλες οι functions στο winapi που έχουν να κάνουν με κείμενο (εδώ το κείμενο είναι το file name) στην πραγματικότητα δεν υπάρχει μέσα στην kernel32.dll συνάρτηση που ονομάζεται CreateFile. Υπάρχει CreateFileW και CreateFileA, η διαφορά των οποίων είναι ότι η πρώτη δέχεται το κείμενο σε UTF-16 (standard) ενώ η δεύτερη στο Windows encoding που αντιστοιχεί στη γλώσσα που έχεις επιλέξει από τη ρύθμιση των Windows για την οποία μιλάμε.

 

Με τα παραπάνω δεδομένα νομίζω καταλαβαίνεις πώς βγαίνει το συμπέρασμα σχετικά με τη λύση του προβλήματος. Μια λεπτομέρεια που αξίζει να αναφέρω είναι το πώς ξέρει κανείς ότι η fopen της C θα καλέσει την CreateFileA και όχι την CreateFileA? Το ξέρει επειδή η fopen της C παίρνει το όνομα αρχείου σε single byte encoding (char*), όπως ακριβώς και η CreateFileA. Αυτό δεν είναι κάποιου είδους εγγύηση για το τι θα γίνει (ας μη το τραβήξω περισσότερο) αλλά είναι σίγουρα μια πολύ ισχυρή ένδειξη, η οποία στην προκειμένη δείχνει το σωστό δρόμο.

  • Like 1

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...