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

 

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

ToUpper() λαμβάνοντας υπ' όψιν τα accents?

Îåêßíçóå áðü ôï ìÝëïò Mitsaras. Τελευταία δημοσίευση από το μέλος Mitsaras στις 28-09-2008, 03:30. Υπάρχουν 3 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  25-09-2008, 12:05 44871

    ToUpper() λαμβάνοντας υπ' όψιν τα accents?

    Καλημέρα.

    Έχω μια περίπτωση ενός globalizable webapplication όπου πρέπει να μετατρέψω σε κεφαλαία μία πρόταση. Προφανώς στα κεφαλαία οι τόνοι φεύγουν, οπότε έψαξα τον σωστό τρόπο για να μπορεί να γίνει αυτό και σε άλλες γλώσσες. Βρήκα το ακόλουθο snippet:

      string stFormD = input.Normalize(NormalizationForm.FormD);
      StringBuilder sb = new StringBuilder();

      for (int ich = 0; ich < stFormD.Length; ich++)
      {
        UnicodeCategory uc = CharUnicodeInfo.GetUnicodeCategory(stFormD[ich]);
        if (uc != UnicodeCategory.NonSpacingMark) sb.Append(stFormD[ich]);
      }


    Δουλεύει, αλλά με παρενέργειες. Δηλαδή, αφαιρεί και τα διαλυτικά (στα κεφαλαία τα διαλυτικά παραμένουν), και αφαιρεί γενικώς τα accents (diacritics), κάτι μη επιθυμητό, ειδικά σε άλλες γλώσσες (πχ Σκανδιναβικές).


    Υπάρχει κάποιος τρόπος που να χειρίζεται αυτού του είδους την μετατροπή από κεφαλαία σε πεζά λαμβάνοντας υπ' όψιν τέτοιες ιδιαιτερότητες;

    Μην αφήνετε τα media να σας "ταΐζουν"!
  •  26-09-2008, 00:40 44887 σε απάντηση της 44871

    Απ: ToUpper() λαμβάνοντας υπ' όψιν τα accents?

    Καμιά ιδέα; Δεν θέλω να καταφύγω σε ένα τεράστιο function με δεκάδες string.Replace (και να πρέπει να το ανανεώνω κάθε φορά που "ανακαλύπτω" τις ιδιαιτερότητες μιας νέας γλώσσας).

    Μην αφήνετε τα media να σας "ταΐζουν"!
  •  28-09-2008, 00:20 44935 σε απάντηση της 44887

    Απ: ToUpper() λαμβάνοντας υπ' όψιν τα accents?

    Απ΄όσο γνωρίζω πουθενά στη γραμματική δεν αναφέρεται ότι οι τόνοι στα κεφαλαία φέυγουν. Αν θέλεις να κάνεις κάτι τέτοιο τότε πρόκειται για custom upper case, όπου θα αφήνεις επιλεγμένα σημεία στίξης.

    Εξάλλου μόνος σου γράφεις "Έχω μια περίπτωση..." με το ε κεφαλαίο και με τόνο.

  •  28-09-2008, 03:30 44937 σε απάντηση της 44935

    Απ: ToUpper() λαμβάνοντας υπ' όψιν τα accents?

    Όχι ακριβώς. Στα ελληνικα, όταν μια πρόταση είναι όλη στα κεφαλαία, δεν τονίζονται οι λέξεις της. Ωστόσο, μια πρόταση σαν και την προηγούμενη, που απλώς το πρώτο γράμμα της πρώτης λέξης είναι κεφαλαίο μόνο, ή περιπτώσεις όπως ονόματα (τα οποία γράφονται με το πρώτο γράμμα κεφαλαίο ακόμα και μέσα στην πρόταση) τονίζονται κανονικά. Εξαίρεση είναι τα διαλυτικά που παραμένουν ή προστίθενται αναλόγως. Πχ Ποπάυ -> ΠΟΠΑΫ, Προϊόντα -> ΠΡΟΪΟΝΤΑ κλπ.

    Το πρόβλημα είναι ότι αυτά αφορούν την ελληνική ορθογραφία και δεν είμαι σίγουρος τι ισχύει σε άλλες γλώσσες πέραν ελληνικών, αγγλικών και ισπανικών. Η κατάσταση περιπλέκεται πάρα πολύ σε κάθε γλώσσα.
    Για παράδειγμα, στα ισπανικά το  ñ θεωρείται γράμμα και όχι n με περισπωμένη (διαβάζεται όπως το ν στο "ενιά"), άρα υπάρχει και Ñ. Από την άλλη, ενώ μεν οι τόνοι (ίδιοι με τα ελληνικά) στα κεφαλαία θεωρούνται προαιρετικοί, λόγω του ότι πολλές λέξεις διαφέρουν αποκλειστικά και μόνο στον τονισμό αλλά έχουν εντελώς διαφορετικό νόημα (Πχ σημαίνει ναι, si σημαίνει αν), η RAE συνιστά να τονίζονται και οι κεφαλαίες λέξεις.


    Και δεν έχω την παραμικρή ιδέα πόσο μπλεγμένα μπορεί να είναι τα πράγματα σε άλλες γλώσσες όπως τα Γαλλικά που αν θυμάμαι καλά ο τονισμός δεν έχει να κάνει με το 'βάρος' μιας συλλαβής, τα Γερμανικά κοκ. Οπότε, εκτός κι αν όντως υπάρχει τέτοιος κανόνας μέσα στο .net Framework, η μόνη λύση είναι να συνενοηθώ με περίπου 10 μεταφραστές (οι οποίοι θα αναλάβουν το localization στις υπόλοιπες γλώσσες) και να φτιάξω ένα τεράστιο replace/regex statement, να το πετάξω σε ξεχωριστό project και να το "ξαναστέλνω" όποτε προστίθεται κάποια νέα γλώσσα στην εφαρμογή, κάτι που είναι πιο μπελαλίδικο απ' ότι χρειάζεται...

    Μην αφήνετε τα media να σας "ταΐζουν"!
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems