SlideShare una empresa de Scribd logo
1 de 16
Descargar para leer sin conexión
Εντοπιότητα
Internationalization
Δομημένος Προγραμματισμός
Τσαγκατάκης Ιωάννης
2
Ο τοπικός πολιτισμός
●
Αλφάβητο
– Αγγλικά: a-z
– Γερμανικά: äöü ÄÖÜ ß
– Ελληνικά: α-ω
●
Γλώσσα
– Ελληνικά
– Γαλλικά
●
Αριθμοί
– 1,000,000.55
– 1.000.000,55
●
Νομίσματα
– $ 24.99
– 24,99 €
●
Ημερομηνία και ώρα
– Sonntag, 3. März 1996
3
Ο τοπικός πολιτισμός (συνέχεια)
●
Ταξινόμηση
– ASCII
●
Airplane
●
Zebra
●
bird
●
car
●
ähnlich
– German
●
Airplane
●
ähnlich
●
Bird
●
Τύποι χαρακτήρων
– ASCII, utf8, utf16, ...
●
Κατηγορίες χαρακτήρων
●
Ερωτήσεις yes/no
●
Τρόπος γραφής
– Αριστερά -> δεξιά
– Βουστροφηδόν
●
Γραμματική
– Ένα, πολλά
– Ένα, δύο, πολλά
– Γένη: Αρσενικό, θυλικό;
– Κανόνες ευγενείας
4
Παράδειγμα
Locale is: el_GR.utf8
A number : -1234567,89
Cost is: 99,99€
Time is: Δευ 06 Ιαν 2020 10:13:02 μμ EET
Today is: Δευτέρα
Parse number '12,42' gives 12,42
Parse number '12.42' gives 12,00
Locale is: el_GR.utf8
A number : -1234567,89
Cost is: 99,99€
Time is: Δευ 06 Ιαν 2020 10:13:02 μμ EET
Today is: Δευτέρα
Parse number '12,42' gives 12,42
Parse number '12.42' gives 12,00
Locale is: en_US.utf8
A number : -1,234,567.89
Cost is: $99.99
Time is: Mon 06 Jan 2020 10:19:00 PM EET
Today is: Monday
Parse number '12,42' gives 12.00
Parse number '12.42' gives 12.42
Locale is: en_GB.utf8
A number : -1,234,567.89
Cost is: £99.99
Time is: Mon 06 Jan 2020 22:19:00 EET
Today is: Monday
Parse number '12,42' gives 12.00
Parse number '12.42' gives 12.42
5
Ρυθμίσεις εντοπιότητας
LC_COLLATE Ταξινόμηση C
LC_CTYPE Κατηγορία χαρακτήρα
LC_MONETARY Νομισματικές Τιμές
LC_NUMERIC Αριθμητικές τιμές
LC_TIME Χρονικές τιμές
LC_ALL
LC_MESSAGES Μεταφράσεις GNU
LC_TELEPHONE Αριθμοί τηλεφώνου
LC_ADDRESS Διευθύνσεις ταχυδρομείου
LC_PAPER Μέγεθος χαρτιού (Α4)
6
Τα αποτελέσματα της εντοπιότητας
●
Ποιοι συνδυασμοί bytes κάνουν ένα χαρακτήρα
●
Ποιος χαρακτήρας θεωρείτε κείμενο ή κεφαλαίος κλπ
●
Η ταξινόμηση κειμένου
●
Το φορμάτ των αριθμών, νομισμάτων κλπ
●
Τα περισσότερα από αυτά θα γίνουν αυτόματα
7
Συναρτήσεις που επηρεάζονται
fprintf, isprint, iswdigit, localeconv, tolower,
fscanf, ispunct, iswgraph, mblen, toupper,
isalnum, isspace, iswlower, mbstowcs, towlower,
isalpha, isupper, iswprint, mbtowc, towupper,
isblank, iswalnum, iswpunct, setlocale, wcscoll,
iscntrl, iswalpha, iswspace, strcoll, wcstod,
isdigit, iswblank, iswupper, strerror, wcstombs,
isgraph, iswcntrl, iswxdigit, strtod, wcsxfrm,
islower, iswctype, isxdigit, ...
8
Παράδειγμα
9
Η συνάρτηση main
int main() {
// set default locale,
setlocale(LC_ALL, "");
// setlocale(LC_ALL, "C");
withLocale("el_GR.utf8"); // Greece
// withLocale("el_CY.utf8"); // Cyprus
withLocale("en_US.utf8"); // USA
withLocale("en_GB.utf8"); // England
bool answer = getYesNo("Are you sure (y/n): ");
printf("You choose %sn", answer ? "Yes" : "No");
}
#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#include <time.h>
#include <monetary.h>
10
Ορίζοντας το locale
void withLocale(char *localeName) {
// Store old locale
char *old_locale = setlocale(LC_ALL, NULL);
char *saved_locale = strdup(old_locale);
// Change locale
setlocale(LC_ALL, localeName);
demoLocale();
// Restore locale
setlocale(LC_ALL, saved_locale);
free(saved_locale);
}
11
Αριθμοί, νομίσματα και ώρα
char buffer[80];
// Getting current locale
printf("nLocale is: %sn", setlocale(LC_ALL, NULL));
// Format number
printf("A number : %'.2fn", -1234567.89);
// Currency
strfmon(buffer, sizeof(buffer), "%n", 99.99);
printf("Cost is: %sn", buffer);
// Handling time
time_t currtime;
struct tm *timer;
time(&currtime);
timer = localtime(&currtime);
strftime(buffer, 80, "%c", timer);
printf("nTime is: %sn", buffer);
strftime(buffer, 80, "%A", timer);
printf("Today is: %sn", buffer);
12
Διάβασμα αριθμών
// Reading numbers
double number;
char *parseText1 = "12,42";
sscanf(parseText1, "%lf", &number);
printf("nParse number '%s' gives %.2lfn", parseText1, number);
char *parseText2 = "12.42";
sscanf(parseText2, "%lf", &number);
printf("Parse number '%s' gives %.2lfn", parseText2, number);
13
Ερωτήσεις ΝΑΙ/ΟΧΙ
bool getYesNo(char *question) {
bool response = false;
int r = -1;
char *answer = NULL;
size_t len = 0;
do {
// puts(gettext(question));
puts(question);
getline(&answer, &len, stdin);
r = rpmatch(answer);
} while (r < 0);
return r;
}
14
Παράδειγμα
Locale is: el_GR.utf8
A number : -1234567,89
Cost is: 99,99€
Time is: Δευ 06 Ιαν 2020 10:13:02 μμ EET
Today is: Δευτέρα
Parse number '12,42' gives 12,42
Parse number '12.42' gives 12,00
Locale is: el_GR.utf8
A number : -1234567,89
Cost is: 99,99€
Time is: Δευ 06 Ιαν 2020 10:13:02 μμ EET
Today is: Δευτέρα
Parse number '12,42' gives 12,42
Parse number '12.42' gives 12,00
Locale is: en_US.utf8
A number : -1,234,567.89
Cost is: $99.99
Time is: Mon 06 Jan 2020 10:19:00 PM EET
Today is: Monday
Parse number '12,42' gives 12.00
Parse number '12.42' gives 12.42
Locale is: en_GB.utf8
A number : -1,234,567.89
Cost is: £99.99
Time is: Mon 06 Jan 2020 22:19:00 EET
Today is: Monday
Parse number '12,42' gives 12.00
Parse number '12.42' gives 12.42
15
Κριτική
●
Η εντοπιότητα είναι αποθηκευμένη σε μια global μεταβλητή
– Δυσκολία υλοποίησης προγραμμάτων με πολλές εντοπιότητες
– Επηρεάζει τις συναρτήσεις printf/scanf/strtod
– Τα περισσότερα προγράμματα θέτουν το locale σε C
●
Δεν υποστηρίζει μεταφράσεις
●
Η C++ έχει ένα άλλο πολυπλοκότερο σύστημα
– Που είναι ανεξάρτητο από την C
– Πρέπει να τα κρατάς συντονισμένα
16
Ήταν δύσκολο;

Más contenido relacionado

Más de jtsagata

Greek utf8
Greek utf8Greek utf8
Greek utf8jtsagata
 
Function pointers in C
Function pointers in CFunction pointers in C
Function pointers in Cjtsagata
 
Why computers can' compute
Why computers can' computeWhy computers can' compute
Why computers can' computejtsagata
 
Τι είναι υπολογισμός
Τι είναι υπολογισμόςΤι είναι υπολογισμός
Τι είναι υπολογισμόςjtsagata
 
IEEE 754 Floating point
IEEE 754 Floating pointIEEE 754 Floating point
IEEE 754 Floating pointjtsagata
 
Η Τέχνη του TeX/LaTeX
Η Τέχνη του TeX/LaTeXΗ Τέχνη του TeX/LaTeX
Η Τέχνη του TeX/LaTeXjtsagata
 
Unikernels
UnikernelsUnikernels
Unikernelsjtsagata
 
FPGA on the Cloud
FPGA on the Cloud FPGA on the Cloud
FPGA on the Cloud jtsagata
 
Evolutionary keyboard Layout
Evolutionary keyboard LayoutEvolutionary keyboard Layout
Evolutionary keyboard Layoutjtsagata
 
Το εργαλείο
Το εργαλείοΤο εργαλείο
Το εργαλείοjtsagata
 

Más de jtsagata (12)

Git intro
Git introGit intro
Git intro
 
Greek utf8
Greek utf8Greek utf8
Greek utf8
 
Function pointers in C
Function pointers in CFunction pointers in C
Function pointers in C
 
Why computers can' compute
Why computers can' computeWhy computers can' compute
Why computers can' compute
 
Τι είναι υπολογισμός
Τι είναι υπολογισμόςΤι είναι υπολογισμός
Τι είναι υπολογισμός
 
IEEE 754 Floating point
IEEE 754 Floating pointIEEE 754 Floating point
IEEE 754 Floating point
 
Η Τέχνη του TeX/LaTeX
Η Τέχνη του TeX/LaTeXΗ Τέχνη του TeX/LaTeX
Η Τέχνη του TeX/LaTeX
 
Unikernels
UnikernelsUnikernels
Unikernels
 
FPGA on the Cloud
FPGA on the Cloud FPGA on the Cloud
FPGA on the Cloud
 
Evolutionary keyboard Layout
Evolutionary keyboard LayoutEvolutionary keyboard Layout
Evolutionary keyboard Layout
 
Omilia
OmiliaOmilia
Omilia
 
Το εργαλείο
Το εργαλείοΤο εργαλείο
Το εργαλείο
 

C locales

  • 2. 2 Ο τοπικός πολιτισμός ● Αλφάβητο – Αγγλικά: a-z – Γερμανικά: äöü ÄÖÜ ß – Ελληνικά: α-ω ● Γλώσσα – Ελληνικά – Γαλλικά ● Αριθμοί – 1,000,000.55 – 1.000.000,55 ● Νομίσματα – $ 24.99 – 24,99 € ● Ημερομηνία και ώρα – Sonntag, 3. März 1996
  • 3. 3 Ο τοπικός πολιτισμός (συνέχεια) ● Ταξινόμηση – ASCII ● Airplane ● Zebra ● bird ● car ● ähnlich – German ● Airplane ● ähnlich ● Bird ● Τύποι χαρακτήρων – ASCII, utf8, utf16, ... ● Κατηγορίες χαρακτήρων ● Ερωτήσεις yes/no ● Τρόπος γραφής – Αριστερά -> δεξιά – Βουστροφηδόν ● Γραμματική – Ένα, πολλά – Ένα, δύο, πολλά – Γένη: Αρσενικό, θυλικό; – Κανόνες ευγενείας
  • 4. 4 Παράδειγμα Locale is: el_GR.utf8 A number : -1234567,89 Cost is: 99,99€ Time is: Δευ 06 Ιαν 2020 10:13:02 μμ EET Today is: Δευτέρα Parse number '12,42' gives 12,42 Parse number '12.42' gives 12,00 Locale is: el_GR.utf8 A number : -1234567,89 Cost is: 99,99€ Time is: Δευ 06 Ιαν 2020 10:13:02 μμ EET Today is: Δευτέρα Parse number '12,42' gives 12,42 Parse number '12.42' gives 12,00 Locale is: en_US.utf8 A number : -1,234,567.89 Cost is: $99.99 Time is: Mon 06 Jan 2020 10:19:00 PM EET Today is: Monday Parse number '12,42' gives 12.00 Parse number '12.42' gives 12.42 Locale is: en_GB.utf8 A number : -1,234,567.89 Cost is: £99.99 Time is: Mon 06 Jan 2020 22:19:00 EET Today is: Monday Parse number '12,42' gives 12.00 Parse number '12.42' gives 12.42
  • 5. 5 Ρυθμίσεις εντοπιότητας LC_COLLATE Ταξινόμηση C LC_CTYPE Κατηγορία χαρακτήρα LC_MONETARY Νομισματικές Τιμές LC_NUMERIC Αριθμητικές τιμές LC_TIME Χρονικές τιμές LC_ALL LC_MESSAGES Μεταφράσεις GNU LC_TELEPHONE Αριθμοί τηλεφώνου LC_ADDRESS Διευθύνσεις ταχυδρομείου LC_PAPER Μέγεθος χαρτιού (Α4)
  • 6. 6 Τα αποτελέσματα της εντοπιότητας ● Ποιοι συνδυασμοί bytes κάνουν ένα χαρακτήρα ● Ποιος χαρακτήρας θεωρείτε κείμενο ή κεφαλαίος κλπ ● Η ταξινόμηση κειμένου ● Το φορμάτ των αριθμών, νομισμάτων κλπ ● Τα περισσότερα από αυτά θα γίνουν αυτόματα
  • 7. 7 Συναρτήσεις που επηρεάζονται fprintf, isprint, iswdigit, localeconv, tolower, fscanf, ispunct, iswgraph, mblen, toupper, isalnum, isspace, iswlower, mbstowcs, towlower, isalpha, isupper, iswprint, mbtowc, towupper, isblank, iswalnum, iswpunct, setlocale, wcscoll, iscntrl, iswalpha, iswspace, strcoll, wcstod, isdigit, iswblank, iswupper, strerror, wcstombs, isgraph, iswcntrl, iswxdigit, strtod, wcsxfrm, islower, iswctype, isxdigit, ...
  • 9. 9 Η συνάρτηση main int main() { // set default locale, setlocale(LC_ALL, ""); // setlocale(LC_ALL, "C"); withLocale("el_GR.utf8"); // Greece // withLocale("el_CY.utf8"); // Cyprus withLocale("en_US.utf8"); // USA withLocale("en_GB.utf8"); // England bool answer = getYesNo("Are you sure (y/n): "); printf("You choose %sn", answer ? "Yes" : "No"); } #include <locale.h> #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include <string.h> #include <time.h> #include <monetary.h>
  • 10. 10 Ορίζοντας το locale void withLocale(char *localeName) { // Store old locale char *old_locale = setlocale(LC_ALL, NULL); char *saved_locale = strdup(old_locale); // Change locale setlocale(LC_ALL, localeName); demoLocale(); // Restore locale setlocale(LC_ALL, saved_locale); free(saved_locale); }
  • 11. 11 Αριθμοί, νομίσματα και ώρα char buffer[80]; // Getting current locale printf("nLocale is: %sn", setlocale(LC_ALL, NULL)); // Format number printf("A number : %'.2fn", -1234567.89); // Currency strfmon(buffer, sizeof(buffer), "%n", 99.99); printf("Cost is: %sn", buffer); // Handling time time_t currtime; struct tm *timer; time(&currtime); timer = localtime(&currtime); strftime(buffer, 80, "%c", timer); printf("nTime is: %sn", buffer); strftime(buffer, 80, "%A", timer); printf("Today is: %sn", buffer);
  • 12. 12 Διάβασμα αριθμών // Reading numbers double number; char *parseText1 = "12,42"; sscanf(parseText1, "%lf", &number); printf("nParse number '%s' gives %.2lfn", parseText1, number); char *parseText2 = "12.42"; sscanf(parseText2, "%lf", &number); printf("Parse number '%s' gives %.2lfn", parseText2, number);
  • 13. 13 Ερωτήσεις ΝΑΙ/ΟΧΙ bool getYesNo(char *question) { bool response = false; int r = -1; char *answer = NULL; size_t len = 0; do { // puts(gettext(question)); puts(question); getline(&answer, &len, stdin); r = rpmatch(answer); } while (r < 0); return r; }
  • 14. 14 Παράδειγμα Locale is: el_GR.utf8 A number : -1234567,89 Cost is: 99,99€ Time is: Δευ 06 Ιαν 2020 10:13:02 μμ EET Today is: Δευτέρα Parse number '12,42' gives 12,42 Parse number '12.42' gives 12,00 Locale is: el_GR.utf8 A number : -1234567,89 Cost is: 99,99€ Time is: Δευ 06 Ιαν 2020 10:13:02 μμ EET Today is: Δευτέρα Parse number '12,42' gives 12,42 Parse number '12.42' gives 12,00 Locale is: en_US.utf8 A number : -1,234,567.89 Cost is: $99.99 Time is: Mon 06 Jan 2020 10:19:00 PM EET Today is: Monday Parse number '12,42' gives 12.00 Parse number '12.42' gives 12.42 Locale is: en_GB.utf8 A number : -1,234,567.89 Cost is: £99.99 Time is: Mon 06 Jan 2020 22:19:00 EET Today is: Monday Parse number '12,42' gives 12.00 Parse number '12.42' gives 12.42
  • 15. 15 Κριτική ● Η εντοπιότητα είναι αποθηκευμένη σε μια global μεταβλητή – Δυσκολία υλοποίησης προγραμμάτων με πολλές εντοπιότητες – Επηρεάζει τις συναρτήσεις printf/scanf/strtod – Τα περισσότερα προγράμματα θέτουν το locale σε C ● Δεν υποστηρίζει μεταφράσεις ● Η C++ έχει ένα άλλο πολυπλοκότερο σύστημα – Που είναι ανεξάρτητο από την C – Πρέπει να τα κρατάς συντονισμένα