זוהי הפקודה perllocale שניתן להפעיל בספק האירוח החינמי של OnWorks באמצעות אחת מתחנות העבודה המקוונות המרובות שלנו, כגון Ubuntu Online, Fedora Online, אמולטור מקוון של Windows או אמולטור מקוון של MAC OS
תָכְנִית:
שֵׁם
perllocale - טיפול מקומי של Perl (אינטרלאומיזציה ולוקליזציה)
תיאור
בהתחלה היה ASCII, "קוד התקן האמריקאי למידע
מחלף", שעובד די טוב עבור אמריקאים עם האלפבית האנגלי והדולר שלהם-
מטבע נקוב. אבל זה לא עובד כל כך טוב אפילו עבור דוברי אנגלית אחרים, אשר
עשוי להשתמש במטבעות שונים, כגון לירה שטרלינג (כסמל למטבע זה
אינו ב-ASCII); וזה חסר תקווה עבור רבים מאלפי העולם
שפות אחרות.
כדי להתמודד עם הליקויים הללו, הומצא הרעיון של מקומות מקומיים (רשמית ה-ISO C,
XPG4, POSIX 1.c "מערכת מקומית"). ואפליקציות נכתבו ונכתבות שהשימוש בהן
מנגנון המקום. תהליך הגשת בקשה כזו מתחשב בה
העדפות המשתמשים בנושאים מסוג זה נקראות בינלאומי (לעתים קרובות
מקוצר בשם i18n); לספר לאפליקציה כזו על קבוצה מסוימת של העדפות
ידוע כ לוקליזציה (l10n).
Perl הורחבה לתמיכה במערכת המקומית. זה נשלט לפי יישום
באמצעות פרגמה אחת, קריאת פונקציה אחת וכמה משתני סביבה.
למרבה הצער, יש לא מעט ליקויים בעיצוב (ולעתים קרובות, ה
יישומים) של מקומות. Unicode הומצא (ראה perlunitut להקדמה עם
כי) בין השאר כדי לטפל בליקויים העיצוביים הללו, ובימינו, יש סדרה של
"מקומות UTF-8", מבוסס על Unicode. אלו אזורים שקבוצת התווים שלהם היא Unicode,
מקודד ב-UTF-8. החל מגרסה 5.20, Perl תומך באופן מלא במקומות UTF-8, למעט
מיון והשוואות מחרוזות. (השתמש ב-Unicode::Collate עבור אלה.) Perl ממשיכה לעשות זאת
תמכו גם במקומונים הישנים שאינם UTF-8. כרגע אין מקומות UTF-8 עבור
פלטפורמות EBCDIC.
(Unicode יוצר גם את "CLDR", "מאגר הנתונים המשותף של המקום",
<http://cldr.unicode.org/> הכולל יותר סוגי מידע ממה שזמין ב
מערכת המקום של POSIX. בזמן כתיבת שורות אלה, לא היה מודול CPAN זה
מספק גישה לנתונים המקודדים ב-XML. עם זאת, ברבים מהמקומות שלה יש את ה- POSIX-
רק נתונים חולצו, וזמינים כמקומות UTF-8 בכתובת
<http://unicode.org/Public/cldr/latest/>.)
מה IS A מְקוֹמִי
מיקום הוא קבוצה של נתונים המתארת היבטים שונים של האופן שבו קהילות שונות באזור
העולם לקטלג את העולם שלהם. קטגוריות אלה מחולקות לסוגים הבאים
(חלקם כוללים הערה קצרה כאן):
קטגוריה "LC_NUMERIC": עיצוב מספרי
זה מציין כיצד יש לעצב מספרים לקריאות אנושית, למשל
תו המשמש כנקודה עשרונית.
קטגוריה "LC_MONETARY": עיצוב סכומים כספיים
קטגוריה "LC_TIME": עיצוב תאריך/שעה
קטגוריה "LC_MESSAGES": שגיאה והודעות אחרות
זה משמש את Perl עצמה רק לגישה להודעות שגיאה של מערכת ההפעלה דרך $!
ו$^E.
קטגוריה "LC_COLLATE": איסוף
זה מציין את סדר האותיות להשוואה ומיון. בלטינית
אלפבית, למשל, "ב", בדרך כלל אחרי "א".
קטגוריה "LC_CTYPE": סוגי תווים
זה מציין, למשל אם תו הוא אות גדולה.
קטגוריות אחרות
לפלטפורמות מסוימות יש קטגוריות אחרות, העוסקות בדברים כמו יחידות מדידה
וגדלי נייר. אף אחד מאלה אינו בשימוש ישיר על ידי פרל, אלא פעולות חיצוניות זאת
Perl מקיים אינטראקציה עם עשוי להשתמש באלה. ראה "לא בטווח של "שימוש מקומי"" להלן.
פרטים נוספים על הקטגוריות שבהן משתמשים פרל ניתנים להלן ב"קטגוריות מקומיות".
יחד, הקטגוריות הללו מובילות דרך ארוכה לקראת היכולת להתאים אישית תוכנית אחת
לרוץ במקומות רבים ושונים. אבל יש ליקויים, אז המשיכו לקרוא.
מכין ל להשתמש LOCALES
Perl עצמה (מחוץ למודול POSIX) לא תשתמש במקומות אלא אם כן נתבקשה זאת במפורש
ל (אבל שוב שים לב שפרל עשוי לקיים אינטראקציה עם קוד שאכן משתמש בהם). גם אם יש
בקשה כזו, את כל מהבאים צריכים להיות נכונים כדי שזה יעבוד כמו שצריך:
· פועל מערכת צריך תמיכה מה היא אזור מערכת. אם כן, אתה צריך למצוא
שהפונקציה "setlocale()" היא חלק מתועד מספריית ה-C שלה.
· הגדרות ל מקומי זֶה אתה להשתמש צריך be מותקן. אתה, או המערכת שלך
מנהל, חייב לוודא שזה המקרה. המקומות הזמינים, ה
המיקום שבו הם נשמרים, ואופן התקנתם משתנים
ממערכת למערכת. מערכות מסוימות מספקות רק כמה מקומות עם קווים קבועים ולא מספקות
לאפשר להוסיף עוד. אחרים מאפשרים לך להוסיף מקומות "שימורים" שסופקו על ידי
ספק מערכות. אחרים מאפשרים לך או למנהל המערכת להגדיר ולהוסיף
מקומות שרירותיים. (ייתכן שתצטרך לבקש מהספק שלך לספק מקומות שימורים
אינם מסופקים עם מערכת ההפעלה שלך.) קרא את תיעוד המערכת שלך עבור
הארה נוספת.
· פרל צריך תאמינו זֶה מה היא אזור מערכת is נתמך. אם כן, "perl
-V:d_setlocale" יגיד שהערך עבור "d_setlocale" הוא "define".
אם אתה רוצה שאפליקציית Perl תעבד ויציג את הנתונים שלך לפי פרט מסוים
מקומי, קוד היישום צריך לכלול את פרגמת "השתמש במקום" (ראה "השימוש המקומי"
פרגמה") היכן שמתאים, וכן at הכי פחות אחד מהדברים הבאים חייב להיות נכון:
1. השמיים קובע מיקום סביבה משתנים (ראה "סביבה") צריך be צורה נכונה סט
up בזמן הפעלת האפליקציה, בעצמך או על ידי מי שהוגדר
חשבון המערכת שלך; אוֹ
2. השמיים יישום צריך סט שלה שֶׁלוֹ אזור באמצעות השיטה המתוארת ב"The setlocale
פוּנקצִיָה".
משתמש LOCALES
השמיים "להשתמש מקומי" פרגמה
כברירת מחדל, Perl עצמו (מחוץ למודול POSIX) מתעלם מהמקום הנוכחי. ה
פרגמת "שימוש מקומי" אומרת לפרל להשתמש במקום הנוכחי עבור פעולות מסוימות. מתחיל ב
v5.16, ישנם פרמטרים אופציונליים לפרגמה זו, המתוארים להלן, המגבילים את אילו
הפעולות מושפעות ממנו.
המקום הנוכחי מוגדר בזמן הביצוע על ידי setlocale () המתואר להלן. אם זה
הפונקציה עדיין לא נקראה במהלך הפעלת התוכנית, הנוכחית
המקום הוא זה שנקבע על ידי ה-"ENVIRONMENT" בתוקף בתחילת ה-
תכנית. אם אין סביבה חוקית, המקום הנוכחי הוא לא משנה מה המערכת
ברירת המחדל הוגדרה ל. במערכות POSIX, סביר להניח, אבל לא בהכרח, ה-"C"
מקומי. ב-Windows, ברירת המחדל מוגדרת דרך המחשב
"לוח בקרה->אפשרויות אזור ושפה" (או המקבילה הנוכחית שלו).
הפעולות המושפעות מהמקום הן:
לֹא בתוך מה היא היקף of "להשתמש מקומי"
יש להשפיע רק על פעולות מסוימות שמקורן מחוץ ל-Perl, כדלקמן:
· המקום הנוכחי משמש כשיוצאים מחוץ לפרל עם פעולות כמו
מערכת() או qx//, אם פעולות אלו רגישות לאזור.
· גם Perl נותנת גישה לפונקציות שונות של ספריית C דרך מודול POSIX.
חלק מהפונקציות הללו מושפעות תמיד מהמקום הנוכחי. לדוגמה,
"POSIX::strftime()" משתמש ב-"LC_TIME"; "POSIX::strtod()" משתמש ב-"LC_NUMERIC";
"POSIX::strcoll()" ו-"POSIX::strxfrm()" השתמשו ב-"LC_COLLATE"; ואופי
פונקציות סיווג כמו "POSIX::isalnum()" משתמשות ב-"LC_CTYPE". כל כאלה
פונקציות יתנהגו בהתאם למקום הבסיסי הנוכחי, גם אם זה
המקום אינו חשוף לחלל Perl.
· מודולי XS עבור כל הקטגוריות אך "LC_NUMERIC" מקבלים את המקום הבסיסי, ו
מכאן שכל פונקציות ספריית C שהן מתקשרות אליהן ישתמשו במקום הבסיסי הזה. לעוד
דיון, ראה "סייגים" ב-perlxs.
שימו לב שכל תוכניות C (כולל מתורגמן perl, שכתוב ב-C)
תמיד יש לו מיקום בסיסי. המקום הזה הוא המקום "C", אלא אם השתנה על ידי a
לקרוא ל setlocale (). כאשר Perl מופעל, הוא משנה את המקום הבסיסי לזה
אשר מסומן על ידי "סביבה". בעת שימוש במודול POSIX או כתיבת XS
קוד, חשוב לזכור שהמקום הבסיסי עשוי להיות משהו
מלבד "C", גם אם התוכנית לא שינתה אותה במפורש.
מתמהמה תופעות of "להשתמש מקומי"
פעולות מסוימות של Perl המוגדרות בטווח של "שימוש מקומי" שומרות על זה
השפעה גם מחוץ לתחום. אלו כוללים:
· פורמט הפלט של א לִכתוֹב() נקבע על ידי הצהרת פורמט מוקדמת יותר
("פורמט" ב-perlfunc), אז האם הפלט מושפע מהמקום או לא
נקבע על ידי אם ה-"format()" נמצא בטווח של "שימוש מקומי", ולא אם
ה-"write()" הוא.
· ניתן להרכיב דפוסי ביטוי רגולרי באמצעות qr// עם התאמה בפועל
נדחה למאוחר יותר. שוב, זה האם הקומפילציה נעשתה בתוך או לא
ההיקף של "שימוש מקומי" שקובע את התנהגות ההתאמה, לא אם ההתאמות
נעשים בהיקף כזה או לא.
תַחַת ""להשתמש מקומי";"
· כל הפעולות הנ"ל
· פוּרמָט הצהרות ("פורמט" ב-perlfunc) ומכאן כל שימוש עוקב ב-"write()".
"LC_NUMERIC".
· מישור ו תפוקה השתמש ב-"LC_NUMERIC". אלה כוללים את התוצאות של
"print()", "printf()", "say()", ו-"sprintf()".
· השמיים השוואה מפעילי ("lt", "le", "cmp", "ge" ו-"gt") השתמש ב-"LC_COLLATE".
"sort()" מושפע גם אם נעשה בו שימוש ללא פונקציית השוואה מפורשת, כי
הוא משתמש ב-"cmp" כברירת מחדל.
הערה: "eq" ו-"ne" אינם מושפעים מהמקום: הם תמיד מבצעים char-by-char
השוואה בין האופרנדים הסקלרים שלהם. מה שכן, אם "cmp" מוצא שזה
אופרנדים שווים לפי רצף האיסוף שצוין על ידי הזרם
locale, הוא ממשיך לבצע השוואה של char-by-char, וחוזר רק 0
(שווה) אם האופרנדים זהים ל-char-for-char. אם אתה באמת רוצה לדעת
האם שתי מחרוזות - ש-"eq" ו-"cmp" עשויות להתייחס לשונות - שוות עד כה
לגבי האיסוף במקום, ראה את הדיון ב"קטגוריה
"LC_COLLATE": איסוף".
· רגיל ביטויים ו שינוי מקרה פונקציות ("uc()", "lc()", "ucfirst()",
ו-"lcfirst()") השתמשו ב-"LC_CTYPE"
· השמיים משתנים $! (והמילים הנרדפות שלו $ERRNO ו-$OS_ERROR) ו $^E (והמילה הנרדפת שלו
$EXTENDED_OS_ERROR) כאשר משתמשים בהם כמחרוזות, השתמש ב-"LC_MESSAGES".
התנהגות ברירת המחדל משוחזרת עם הפרגמה "ללא מיקום", או עם הגעה לסוף
הבלוק המקיף את "שימוש מקומי". שים לב ששיחות "שימוש מקומי" עשויות להיות מקוננות, וזה
מה שבפועל בתוך תחום פנימי יחזור בסופו של דבר לכללי הטווח החיצוני
של ההיקף הפנימי.
תוצאת המחרוזת של כל פעולה המשתמשת במידע מקומי נגועה, כפי שהיא
ייתכן שמקום לא אמין. ראה "אבטחה".
החל ב-Perl v5.16 בצורה מאוד מוגבלת, ובאופן כללי יותר ב-v5.22, אתה יכול
להגביל איזו קטגוריה או קטגוריות מופעלות על ידי מופע מסוים זה של
פרגמה על ידי הוספת פרמטרים לה. לדוגמה,
השתמש ב-loce qw(:ctype :numeric);
מאפשר מודעות מקומית בהיקף של רק אותן פעולות (המפורטות לעיל) שהן
מושפע מ-"LC_CTYPE" ו-"LC_NUMERIC".
הקטגוריות האפשריות הן: ": collate", ":ctype", ":messages", ":monetary", ":numeric",
":זמן", וקטגוריית הפסאודו ":תווים" (מתואר להלן).
כך אפשר לומר
השתמש במקום ':messages';
ורק $! ו-$^E יהיו מודעים למקום. כל השאר לא מושפע.
מאז Perl כרגע לא עושה שום דבר עם הקטגוריה "LC_MONETARY", מציין
":monetary" לא עושה כלום למעשה. למערכות מסוימות יש קטגוריות אחרות, כגון
"LC_PAPER_SIZE", אבל גם פרל לא יודע עליהם כלום, ואין דרך לעשות זאת
ציין אותם בטיעוני הפרגמה הזו.
אתה יכול גם לומר בקלות להשתמש בכל הקטגוריות מלבד אחת, על ידי אחת מהן, למשל,
השתמש במקום ':!ctype';
השתמש במקום ':not_ctype';
שניהם מתכוונים לאפשר מודעות מקומית לכל הקטגוריות מלבד "LC_CTYPE". רק אחד
ניתן לציין ארגומנט קטגוריה ב"שימוש מקומי" אם הוא בצורת השלילה.
לפני גרסה 5.22 זמינה רק צורה אחת של הפרגמה עם טיעונים:
השתמש במקום ':not_characters';
(וצריך לומר "לא_"; אתה לא יכול להשתמש בטופס המפץ "!"). קטגוריית פסאודו זו היא א
קיצור לציון ":collate" וגם ":ctype". לפיכך, בצורה השלילה, זה כן
כמעט אותו דבר כמו להגיד
השתמש ב-loce qw(:messages:monetary:numeric:time);
אנו משתמשים במונח "כמעט", מכיוון שגם ":not_characters" נדלק
"השתמש בתכונה 'unicode_strings'" בטווח שלה. טופס זה פחות שימושי בגרסה 5.20 ו
מאוחר יותר, ומתואר במלואו ב"Unicode ו-UTF-8", אבל בקצרה, זה אומר לפרל לא
השתמש בחלקי התווים של הגדרת המקום, כלומר "LC_CTYPE" ו
קטגוריות "LC_COLLATE". במקום זאת הוא ישתמש בערכת התווים המקורית (מורחב ב
Unicode). בעת שימוש בפרמטר זה, אתה אחראי לקבל את החיצוני
ערכת תווים מתורגמת ל-Native/Unicode (שזה כבר יהיה אם כן
אחד ממקומות UTF-8 הפופולריים יותר ויותר). יש דרכים נוחות לעשות זאת,
כמתואר ב"Unicode ו-UTF-8".
השמיים setlocale פונקציה
אתה יכול להחליף מקומות בתדירות שתרצה בזמן ריצה עם ה-"POSIX::setlocale()"
פוּנקצִיָה:
# ייבא ערכת כלים לטיפול במקומות ממודול POSIX.
# דוגמה זו משתמשת: setlocale -- קריאת הפונקציה
# LC_CTYPE -- מוסבר להלן
# (הצגת הבדיקה להצלחה/כישלון של פעולות הוא
# הושמט בדוגמאות אלה כדי למנוע הסחת דעת מהעיקרית
נקודה אחת)
השתמש ב-POSIX qw(locale_h);
להשתמש באזור;
שלי $old_locale;
# שאילתה ושמור את המקום הישן
$old_locale = setlocale(LC_CTYPE);
setlocale(LC_CTYPE, "fr_CA.ISO8859-1");
# LC_CTYPE כעת במקום "צרפתית, קנדה, ערכת קוד ISO 8859-1"
setlocale(LC_CTYPE, "");
# LC_CTYPE מאופס כעת לברירת המחדל שהוגדרה על ידי
# משתני סביבה LC_ALL/LC_CTYPE/LANG, או למערכת
# ברירת מחדל. ראה להלן לתיעוד.
# שחזר את המקום הישן
setlocale(LC_CTYPE, $old_locale);
זה משפיע בו זמנית על כל השרשורים של התוכנית, כך שזה עשוי להיות בעייתי לשימוש
מקומות ביישומים משורשרים למעט מקום שבו יש מיקום יחיד המתאים לכולם
חוטים.
הארגומנט הראשון של "setlocale()" נותן את ה- קטגוריה, השני ה אזור. ה
הקטגוריה מציינת באיזה היבט של עיבוד הנתונים ברצונך ליישם כללים ספציפיים לאזור.
שמות הקטגוריות נדונים ב"קטגוריות מקומיות" ו"סביבה". המקום הוא ה
שם של אוסף של מידע התאמה אישית המתאים לפרט מסוים
שילוב של שפה, מדינה או טריטוריה וערכת קוד. המשך לקרוא לקבלת רמזים על
מתן שמות של מקומות: לא כל המערכות שמות מקומות כמו בדוגמה.
אם לא מסופק ארגומנט שני והקטגוריה היא משהו אחר מאשר "LC_ALL", ה-
הפונקציה מחזירה מחרוזת ששמה את המקום הנוכחי עבור הקטגוריה. אתה יכול להשתמש בזה
ערך כארגומנט השני בקריאה שלאחר מכן ל-"setlocale()", אבל בחלק מהפלטפורמות
המיתר אטום, לא משהו שרוב האנשים יוכלו לפענח לגבי מה
מיקום זה אומר.
אם לא מסופק ארגומנט שני והקטגוריה היא "LC_ALL", התוצאה היא
תלוי יישום. ייתכן שזו מחרוזת של שמות מקומיים משורשרים (גם מפריד
תלוי יישום) או שם מקומי יחיד. נא להתייעץ עם שלך setlocale(3) גבר
לפרטים נוספים.
אם ניתן ארגומנט שני והוא מתאים למקום חוקי, המקום עבור ה-
הקטגוריה מוגדרת לערך זה, והפונקציה מחזירה את ערך המקום הנוכחי. אתה
לאחר מכן תוכל להשתמש בזה בקריאה נוספת ל-"setlocale()". (ביישומים מסוימים, ה
ערך ההחזרה עשוי לפעמים להיות שונה מהערך שנתת כארגומנט השני - תחשוב עליו
זה ככינוי לערך שנתת.)
כפי שמראה הדוגמה, אם הארגומנט השני הוא מחרוזת ריקה, המקום של הקטגוריה הוא
חזר לברירת המחדל שצוינה על ידי משתני הסביבה המתאימים. בדרך כלל,
זה מביא לחזרה לברירת המחדל שהייתה בתוקף כאשר Perl הפעלתה: שינויים ב
הסביבה שנוצרה על ידי האפליקציה לאחר ההפעלה עשויה להיות מורגשת או לא, בהתאם
בספריית C של המערכת שלך.
שים לב שכאשר מצוין צורה של "שימוש מקומי" שאינו כולל את כל הקטגוריות,
Perl מתעלם מהקטגוריות שלא נכללו.
אם "set_locale()" נכשל מסיבה כלשהי (לדוגמה, ניסיון להגדיר למקום
לא ידוע למערכת), המקום עבור הקטגוריה לא משתנה, והפונקציה
מחזיר "undef".
למידע נוסף על הקטגוריות, התייעצו setlocale(3).
מציאה מקומי
למקומות הזמינים במערכת שלך, התייעצו גם setlocale(3) לראות אם זה מוביל ל
רשימת המקומות הזמינים (חפש את ה לִרְאוֹת גם סָעִיף). אם זה נכשל, נסה את
שורות הפקודה הבאות:
אזור - א
nlsinfo
ls /usr/lib/nls/loc
ls /usr/lib/locale
ls /usr/lib/nls
ls /usr/share/locale
ולראות אם הם מפרטים משהו שדומה לאלה
en_US.ISO8859-1 de_DE.ISO8859-1 ru_RU.ISO8859-5
en_US.iso88591 de_DE.iso88591 ru_RU.iso88595
en_US de_DE ru_RU
en de ru
אנגלית גרמנית רוסית
english.iso88591 german.iso88591 russian.iso88595
english.roman8 russian.koi8r
למרבה הצער, למרות שממשק השיחות עבור "setlocale()" עבר תקן, שמות של
מקומיים והספריות שבהן התצורה שוכנת לא היו. הצורה הבסיסית
של השם הוא שפה_טריטוריה.ערכת קודים, אבל החלקים האחרונים לאחר שפה אינם
נוכח תמיד. ה שפה ו מדינה הם בדרך כלל מהסטנדרטים ISO 3166 ו ISO
639, הקיצורים בני שתי האותיות למדינות ולשפות העולם,
בהתאמה. ה ערכת קודים חלק מזכיר לעתים קרובות כמה ISO 8859 מערכת תווים, הלטינית
ערכות קוד. לדוגמה, "ISO 8859-1" הוא מה שנקרא "ערכת הקוד של מערב אירופה" שיכולה
ישמשו כדי לקודד את רוב שפות מערב אירופה בצורה נאותה. שוב, יש כמה
דרכים לכתוב אפילו את השם של אותו תקן. בצער.
שני אזורים מיוחדים ראויים לציון מיוחד: "C" ו-"POSIX". כרגע אלו הם
למעשה אותו מיקום: ההבדל הוא בעיקר בכך שהראשון מוגדר על ידי ה-
תקן C, השני בתקן POSIX. הם מגדירים את ברירת מחדל אזור בי
כל תוכנית מתחילה בהיעדר מידע מקומי בסביבתה. (ה
ברירת מחדל מקום ברירת המחדל, אם תרצו.) השפה שלו היא אנגלית (אמריקאית) והשפה שלה
ערכת קוד תווים ASCII או, לעתים רחוקות, ערכת-על שלה (כגון "DEC Multinational
סט תווים (DEC-MCS)"). אזהרה. ייתכן שמקום C שנמסר על ידי חלק מהספקים לא
למעשה מתאימים בדיוק למה שתקן C דורש. אז היזהרו.
הערה: לא לכל המערכות יש את המקום "POSIX" (לא כל המערכות תואמות POSIX), אז
השתמש ב-"C" כאשר אתה צריך לציין במפורש את מקום ברירת המחדל הזה.
מְקוֹמִי בעיות
אתה עלול להיתקל בהודעת האזהרה הבאה בעת ההפעלה של Perl:
perl: אזהרה: הגדרת המקום נכשלה.
perl: אזהרה: אנא בדוק שהגדרות המקום שלך:
LC_ALL = "En_US",
LANG = (לא מוגדר)
נתמכים ומותקנים במערכת שלך.
perl: אזהרה: נופל חזרה למקום הסטנדרטי ("C").
המשמעות היא שבהגדרות המקומיות שלך הוגדר "LC_ALL" ל-"En_US" ו-LANG קיים אבל יש
אין ערך. פרל ניסתה להאמין לך אבל לא הצליחה. במקום זאת, פרל נכנע ונפל לאחור
למקום "C", אזור ברירת המחדל שאמור לעבוד לא משנה מה. (עַל
Windows, תחילה הוא מנסה לחזור למקום ברירת המחדל של המערכת.) זה בדרך כלל אומר
הגדרות המקום שלך היו שגויות, הן מזכירות מקומות שהמערכת שלך מעולם לא שמעה עליהם, או
בהתקנת המקום במערכת שלך יש בעיות (לדוגמה, חלק מקובצי המערכת הם
שבור או חסר). ישנם תיקונים מהירים וזמניים לבעיות אלה, כמו גם
תיקונים יסודיים ומתמשכים יותר.
בדיקות ל שבור מקומי
אם אתה בונה את Perl ממקור, קובץ חבילת הבדיקה של Perl lib/locale.t ניתן להשתמש בו כדי
בדוק את המקומות במערכת שלך. הגדרת משתנה הסביבה "PERL_DEBUG_FULL_TEST"
ל-1 יגרום לו להפיק תוצאות מפורטות. למשל, בלינוקס, אפשר לומר
PERL_DEBUG_FULL_TEST=1 ./perl -T -Ilib lib/locale.t > locale.log 2>&1
מלבד בדיקות רבות אחרות, הוא יבדוק כל מקום שהוא מוצא במערכת שלך כדי לראות אם הם
תואם לתקן POSIX. אם יש שגיאות, הוא יכלול סיכום לקראת הסוף
של הפלט של אילו מקומיים עברו את כל המבחנים שלו, ואיזה נכשל, ומדוע.
זמנית קביעה אזור בעיות
שני התיקונים המהירים ביותר הם להפוך את פרל לשתוק לגבי חוסר עקביות מקומי
או כדי להריץ את Perl תחת אזור ברירת המחדל "C".
ניתן להשתיק את הגניחות של פרל על בעיות מקומיות על ידי הגדרת משתנה הסביבה
"PERL_BADLANG" עד "0" או "". השיטה הזו באמת רק מטאטאת את הבעיה מתחת לשטיח:
אתה אומר לפרל לשתוק גם כשפרל רואה שמשהו לא בסדר. אל תהיה מופתע
אם מאוחר יותר משהו תלוי מקומי יתנהג בצורה לא נכונה.
ניתן להפעיל את Perl תחת המקום "C" על ידי הגדרת משתנה הסביבה "LC_ALL" ל-"C".
שיטה זו אולי קצת יותר מתורבתת מגישת "PERL_BADLANG", אבל הגדרה
"LC_ALL" (או משתנים מקומיים אחרים) עשויים להשפיע גם על תוכניות אחרות, לא רק על Perl. ב
במיוחד, תוכניות חיצוניות המופעלות מתוך Perl יראו את השינויים הללו. אם תעשה
ההגדרות החדשות קבועות (המשך לקרוא), כל התוכניות שאתה מפעיל רואות את השינויים. לִרְאוֹת
"סביבה" עבור הרשימה המלאה של משתני הסביבה הרלוונטיים ו-"USING LOCALES" עבור
ההשפעות שלהם בפרל. ניתן להסיק בקלות אפקטים בתוכניות אחרות. לדוגמה, ה
המשתנה "LC_COLLATE" עשוי להשפיע על שלך sort תוכנית (או כל תוכנית שהיא
מסדר "רשומות" בסדר אלפביתי במערכת שלך נקרא).
אתה יכול לבדוק את שינוי המשתנים האלה באופן זמני, ואם נראה שההגדרות החדשות כן
עזרה, הכנס את ההגדרות האלה לקבצי ההפעלה של המעטפת שלך. עיין בתיעוד המקומי שלך
לפרטים המדויקים. עבור קונכיות דמויות בורן (sh, ksh, לחבוט, ZSH):
LC_ALL=iw_US.ISO8859-1
ייצא LC_ALL
זה מניח שראינו את המקום "en_US.ISO8859-1" באמצעות הפקודות שנדונו לעיל.
החלטנו לנסות את זה במקום המקום הפגום שלעיל "En_US" - ובקונכיות צ'יש
(CSH, tcsh)
setenv LC_ALL en_US.ISO8859-1
או אם יש לך את היישום "env" שאתה יכול לעשות (בכל מעטפת)
env LC_ALL=en_US.ISO8859-1 perl ...
אם אינך יודע איזו מעטפת יש לך, התייעץ עם דלפק העזרה המקומי שלך או המקביל.
לצמיתות קביעה אזור בעיות
התיקונים האיטיים אך הטובים יותר הם כאשר אתה יכול לתקן את עצמך
תצורה שגויה של משתני הסביבה שלך. התצורה השגויה (לשיר) של ה
האזורים של כל המערכת בדרך כלל דורשים את עזרתו של מנהל המערכת הידידותי שלך.
ראשית, ראה מוקדם יותר במסמך זה על "מציאת מקומות". זה אומר איך למצוא איזה
מקומיים נתמכים באמת - וחשוב מכך, מותקנים - במערכת שלך. בשלנו
הודעת שגיאה לדוגמה, משתני סביבה המשפיעים על המקום רשומים לפי הסדר
בחשיבות הולכת ופוחתת (ומשתנים לא מוגדרים אינם חשובים). לכן, לאחר LC_ALL
מוגדר ל-"En_US" חייבת להיות הבחירה הרעה, כפי שמוצג בהודעת השגיאה. ניסיון ראשון
תיקון הגדרות המקום המפורטות תחילה.
שנית, אם אתה משתמש בפקודות המפורטות אתה רואה משהו בדיוק (התאמות של קידומת לא
ספירה ורישיות סופרות בדרך כלל) כמו "En_US" ללא המרכאות, אז אתה אמור להיות בסדר
מכיוון שאתה משתמש בשם מקומי שאמור להיות מותקן וזמין במערכת שלך.
במקרה זה, ראה "תיקון קבוע של תצורת המקום של המערכת שלך".
לצמיתות קביעה שֶׁלְךָ המערכת של אזור תצורה
זה כאשר אתה רואה משהו כמו:
perl: אזהרה: אנא בדוק שהגדרות המקום שלך:
LC_ALL = "En_US",
LANG = (לא מוגדר)
נתמכים ומותקנים במערכת שלך.
אבל אז לא יכול לראות את "En_US" ברשימה לפי הפקודות שהוזכרו לעיל. אולי תראה
דברים כמו "en_US.ISO8859-1", אבל זה לא אותו דבר. במקרה זה, נסה לרוץ תחת a
מקומי שאתה יכול לרשום ושאיכשהו תואם למה שניסית. כללי ההתאמה
שמות מקומיים מעט מעורפלים מכיוון שהסטנדרטיזציה חלשה בתחום זה. ראה שוב את
"מציאת מקומות" על כללים כלליים.
קביעה מערכת אזור תצורה
פנה למנהל מערכת (רצוי משלך) ודווח על הודעת השגיאה המדויקת
אתה מקבל, ובקש מהם לקרוא את אותו תיעוד שאתה קורא כעת. הם צריכים להיות
מסוגל לבדוק אם יש משהו לא בסדר בתצורת המקום של ה-
מערכת. הקטע "מציאת מקומות" למרבה הצער מעט מעורפל לגבי המדויק
פקודות ומקומות כי הדברים האלה לא כל כך סטנדרטיים.
השמיים localeconv פונקציה
הפונקציה "POSIX::localeconv()" מאפשרת לך לקבל פרטים על המיקום התלוי
מידע עיצוב מספרי שצוין על ידי הבסיס הנוכחי "LC_NUMERIC" ו
מקומיים של "LC_MONETARY" (ללא קשר אם נקרא מתוך תחום "השתמש במיקום"
או שלא). (אם אתה רק רוצה את השם של המקום הנוכחי עבור קטגוריה מסוימת, השתמש
"POSIX::setlocale()" עם פרמטר בודד - ראה "פונקציית setlocale".)
השתמש ב-POSIX qw(locale_h);
# קבל הפניה ל-hash של מידע תלוי מקומי
$locale_values = localeconv();
# פלט ממוין רשימה של הערכים
עבור (מיון מפתחות %$locale_values) {
printf "%-20s = %s\n", $_, $locale_values->{$_}
}
"localeconv()" אינו לוקח ארגומנטים ומחזיר a הפניה ל חשיש. המפתחות של זה
hash הם שמות משתנים לעיצוב, כגון "נקודה עשרונית" ו-"אלפי_ספטמבר". ה
ערכים הם הערכים התואמים, אה. ראה "localeconv" ב-POSIX לדוגמא ארוכה יותר
פירוט הקטגוריות שיישום עשוי לצפות לספק; חלקם מספקים יותר
ואחרים פחות. אתה לא צריך "שימוש מקומי" מפורש, כי "localeconv()" תמיד
צופה במקום הנוכחי.
הנה תוכנית דוגמה פשוטה המשכתבת מחדש את הפרמטרים של שורת הפקודה שלה כ
מספרים שלמים בפורמט נכון במקום הנוכחי:
השתמש ב-POSIX qw(locale_h);
# קבל כמה מפרמטרי העיצוב המספרי של המקום
שלי ($thousands_sep, $grouping) =
@{localeconv()}{'thousands_sep', 'grouping'};
# החל ברירת מחדל אם חסרים ערכים
$thousands_sep = ',' אלא אם כן $thousands_sep;
# קיבוץ ו-mon_grouping הן רשימות עמוסות
# של מספרים שלמים קטנים (תווים) מספרים את
# קיבוץ (אלף_ספים וחודש_אלף_ספים
# בהיותם מחלקי הקבוצה) של מספרים ו
# כמויות כספיות. משמעויות המספרים השלמים:
מס' 255 אומר שאין יותר קיבוץ, 0 אומר חזרה
# הקיבוץ הקודם, 1-254 אומר להשתמש בזה
# בתור הקיבוץ הנוכחי. קיבוץ עובר מ
# מימין לשמאל (ספרות נמוכות עד גבוהות). בתוך ה
# למטה אנו מרמים מעט בכך שלעולם לא משתמשים בשום דבר
# אחר מהקיבוץ הראשון (מה שזה לא יהיה).
if ($grouping) {
@grouping = unpack("C*", $grouping);
אחר} {
@grouping = (3);
}
# עיצוב פרמטרים של שורת הפקודה עבור המקום הנוכחי
עבור (@ARGV) {
$_ = int; # קוצץ חלק שאינו שלם
1 זמן
s/(\d)(\d{$grouping[0]}($|$thousands_sep))/$1$thousands_sep$2/;
הדפס "$_";
}
הדפס "\n";
שים לב שאם לפלטפורמה אין "LC_NUMERIC" ו/או "LC_MONETARY" זמינים או
מופעל, הרכיבים המתאימים של ה-hash יהיו חסרים.
I18N::Langinfo
ממשק נוסף לשאילתת מידע תלוי מקומי הוא ה
הפונקציה "I18N::Langinfo::langinfo()", זמינה לפחות במערכות דמויות Unix ו-VMS.
הדוגמה הבאה תייבא את הפונקציה "langinfo()" עצמה ושלושה קבועים ל
לשמש כארגומנטים ל-"langinfo()": קבוע עבור היום הראשון המקוצר בשבוע
(המספור מתחיל מיום ראשון = 1) ועוד שני קבועים לחיוב ו
תשובות שליליות לשאלה של כן/לא במקום הנוכחי.
השתמש ב-I18N::Langinfo qw(langinfo ABDAY_1 YESSTR NOSTR);
my ($abday_1, $yesstr, $nostr)
= map { langinfo } qw(ABDAY_1 YESSTR NOSTR);
הדפס "$abday_1? [$yesstr/$nostr] ";
במילים אחרות, במקום "C" (או באנגלית) סביר להניח שהרשימה לעיל ידפיס משהו
כמו:
שמש? [כן לא]
ראה I18N::Langinfo למידע נוסף.
מְקוֹמִי קטגוריות
הסעיפים הבאים מתארים קטגוריות מקומיות בסיסיות. מעבר לאלה, כמה
קטגוריות שילוב מאפשרות מניפולציה של יותר מקטגוריה בסיסית אחת בכל פעם. לִרְאוֹת
"סביבה" לדיון באלה.
קטגוריה "LC_COLLATE": איסוף
בהיקף של טופס "שימוש מקומי" הכולל איסוף, פרל מסתכל על
משתנה סביבה "LC_COLLATE" לקביעת מושגי היישום על איסוף
(סדר) של תווים. לדוגמה, "b" אחרי "a" באלפבית לטיני, אבל איפה עושים
"a" ו-"aa" שייכים? ובעוד ש"צבע" בא אחרי "שוקולד" באנגלית, מה לגבי ב
ספרדית מסורתית?
כל האיסוף הבא הוא הגיוני ואתה עשוי לפגוש כל אחד מהם אם אתה "משתמש מקומי".
ABCDE abcde
A a B b C c D d E ה
a A b B c C d D e E
abcde ABCDE
הנה קטע קוד שיגיד אילו תווי "מילה" הם במקום הנוכחי, בזה
סדר המקום:
להשתמש באזור;
print +(מיין grep /\w/, map { chr } 0..255), "\n";
השווה זאת עם הדמויות שאתה רואה והסדר שלהן אם אתה מציין זאת במפורש
יש להתעלם מהמקום:
אין מקום;
print +(מיין grep /\w/, map { chr } 0..255), "\n";
אוסף מקורי זה של מכונה (וזה מה שאתה מקבל אלא אם הופיע "השתמש מקומי".
מוקדם יותר באותו בלוק) יש להשתמש למיון נתונים בינאריים גולמיים, בעוד שהמקום-
איסוף תלוי של הדוגמה הראשונה שימושי עבור טקסט טבעי.
כפי שצוין ב-"USING LOCALES", "cmp" משווה לפי אזור האיסוף הנוכחי כאשר
"השתמש במיקום" קיים, אך נופל חזרה להשוואה בין תווים למחרוזות
המקום אומר שהם שווים. אתה יכול להשתמש ב-"POSIX::strcoll()" אם אתה לא רוצה בסתיו הזה-
חזור:
השתמש ב-POSIX qw(strcoll);
$equal_in_locale =
!strcoll("התעלמו מהרווח והאותיות", "SpaceAndCaseIgnored");
$equal_in_locale יהיה נכון אם מיקום האיסוף מציין סדר דמוי מילון
שמתעלם לחלוטין מתווי החלל ואשר מקפל את האותיות.
Perl תומך כרגע רק במקומות של בייט בודד עבור "LC_COLLATE". זה אומר שא
סביר להניח שמקום UTF-8 פשוט ייתן לך הזמנה מקורית במכונה. השתמש ב-Unicode::איסוף עבור
היישום המלא של אלגוריתם איסוף יוניקוד.
אם יש לך מחרוזת בודדת שברצונך לבדוק נגדה "שוויון מקומי".
כמה אחרים, אתה עשוי לחשוב שאתה יכול להשיג מעט יעילות על ידי שימוש
"POSIX::strxfrm()" בשילוב עם "eq":
השתמש ב-POSIX qw(strxfrm);
$xfrm_string = strxfrm("מחרוזת רישיות מעורבת");
הדפס "איסוף מקומי מתעלם מרווחים\n"
if $xfrm_string eq strxfrm("Mixed-casestring");
הדפס "איסוף מקומי מתעלם מקפים\n"
if $xfrm_string eq strxfrm("מחרוזת מקרים מעורבים");
הדפס "איסוף מקומי מתעלם מרישיות\n"
if $xfrm_string eq strxfrm("מחרוזת מקרים מעורבים");
"strxfrm()" לוקח מחרוזת וממפה אותה למחרוזת שעברה טרנספורמציה לשימוש ב-char-by-char
השוואות מול מחרוזות אחרות שעברו טרנספורמציה במהלך איסוף. "מתחת למכסה המנוע", מקומי-
אופרטורי השוואת Perl המושפעים קוראים "strxfrm()" עבור שני האופרנדים, ואז בצעו char-by-
השוואת char של המיתרים שעברו טרנספורמציה. על ידי קריאה מפורשת ל-"strxfrm()" ושימוש ב-a
השוואה שאינה מושפעת מקומית, הדוגמה מנסה לשמור כמה טרנספורמציות.
אבל למעשה, זה לא חוסך כלום: קסם פרל (ראה "משתני קסם" ב-perlguts)
יוצר את הגרסה שעברה טרנספורמציה של מחרוזת בפעם הראשונה שהיא נחוצה בהשוואה,
ואז שומר את הגרסה הזו בסביבה למקרה שיהיה צורך בה שוב. דוגמה שכתבה מחדש את הקל
דרך עם "cmp" פועל בדיוק באותה מהירות. זה גם מתמודד עם תווים אפס המוטמעים ב
מחרוזות; אם אתה קורא ל-"strxfrm()" ישירות, הוא מתייחס ל-null הראשון שהוא מוצא כ-a
טרמינטור. אל תצפה שהמחרוזות שעברו שינוי שהוא מייצר יהיו ניידות לרוחב
מערכות - או אפילו מגרסה אחת של מערכת ההפעלה שלך לאחרת. בקיצור, לא
קרא ישירות ל- "strxfrm()": תן לפרל לעשות זאת עבורך.
הערה: "השתמש במיקום" אינו מוצג בחלק מהדוגמאות האלה מכיוון שאין בו צורך:
"strcoll()" ו-"strxfrm()" הן פונקציות POSIX המשתמשות במערכת הסטנדרטית שסופקה
פונקציות "libc" שתמיד מצייתות למקום הנוכחי של "LC_COLLATE".
קטגוריה "LC_CTYPE": אופי סוגים
בהיקף של טופס "שימוש מקומי" הכולל "LC_CTYPE", Perl מצייתת ל-"LC_CTYPE"
הגדרת המקום. זה שולט ברעיון האפליקציה לגבי התווים
אלפביתי, מספרי, סימני פיסוק, וכו '. זה משפיע על הביטוי הרגולרי "\w" של Perl
מטנוטציה, המייצגת תווים אלפאנומריים--כלומר, אלפביתי, מספרי ו
הקו התחתון המקורי של הפלטפורמה. (התייעצו עם perlre למידע נוסף על רגיל
ביטויים.) הודות ל-"LC_CTYPE", בהתאם להגדרת המקום שלך, תווים כמו
"ae", "`", "ss" ו-"o" עשויים להיות מובנים כתווים "\w". זה גם משפיע על דברים
כמו "\s", "\D", ומחלקות התווים POSIX, כמו "[[:graph:]]". (לִרְאוֹת
perlrecharclass למידע נוסף על כל אלה.)
המקום "LC_CTYPE" מספק גם את המפה המשמשת בתעתיק תווים ביניהם
אותיות קטנות ורישיות. זה משפיע על פונקציות מיפוי המקרים--"fc()", "lc()",
"lcfirst()", "uc()", ו-"ucfirst()"; אינטרפולציה של מיפוי מקרים עם "\F", "\l", "\L",
"\u", או "\U" במחרוזות במירכאות כפולות והחלפות "s///"; ובלתי תלוי במקרה
התאמת דפוסי ביטוי רגולרי באמצעות השינוי "i".
לבסוף, "LC_CTYPE" משפיע על מבחן מחלקת התווים POSIX (הוצא משימוש).
functions--"POSIX::isalpha()", "POSIX::islower()", וכן הלאה. למשל, אם אתה עובר דירה
מהמקום "C" ועד 7-bit ISO 646, אתה עשוי לגלות - אולי להפתעתך - כי
"|" עובר מהמחלקה "POSIX::ispunct()" ל-"POSIX::isalpha()". למרבה הצער, זה
יוצר בעיות גדולות עבור ביטויים רגולריים. "|" עדיין מתכוון לחילופין למרות שזה
תואם "\w". החל מגרסה 5.22, תועלה אזהרה כאשר מקום כזה יתחלף
לְתוֹך. פרטים נוספים ניתנים בכמה פסקאות בהמשך.
החל מגרסה 5.20, Perl תומך במקומות UTF-8 עבור "LC_CTYPE", אך חוץ מזה Perl בלבד
תומך במקומות של בייט בודד, כגון סדרת ISO 8859. זה אומר אופי רחב
מקומות, למשל עבור שפות אסייתיות, אינם נתמכים היטב. (אם יש לפלטפורמה
את היכולת של Perl לזהות מיקום כזה, החל מ-Perl v5.22, Perl תזהיר,
מופעלת כברירת מחדל, תוך שימוש בקטגוריית האזהרה "locale", בכל פעם שמקום כזה משתנה
התמיכה המקומית של UTF-8 היא למעשה ערכת על של מקומות POSIX, כי היא כן
התנהגות Unicode מלאה באמת כאילו לא היה מקום "LC_CTYPE" בתוקף בכלל (למעט
הכתמה; ראה "אבטחה"). מקומות POSIX, אפילו UTF-8, חסרים מושגים מסוימים
ב-Unicode, כמו הרעיון ששינוי המקרה של דמות יכול להתרחב להיות יותר
מאשר דמות אחת. Perl במקום UTF-8, ייתן לך את ההרחבה הזו. קודם ל
v5.20, Perl טיפלה במיקום UTF-8 בפלטפורמות מסוימות כמו ISO 8859-1, עם כמה
הגבלות, ובפלטפורמות אחרות יותר כמו המקום "C". עבור מהדורות v5.16 ו
v5.18, "use locale 'not_characters" יכול לשמש כדרך לעקיפת הבעיה (ראה "Unicode
ו-UTF-8").
שימו לב שיש לא מעט דברים שאינם מושפעים מהמקום הנוכחי. כל
דמות מילולית היא הדמות המקורית לפלטפורמה הנתונה. מכאן ש'A' פירושו ה
תו בנקודת קוד 65 בפלטפורמות ASCII, ו-193 ב-EBCDIC. זה יכול להיות ואולי לא
'A' במקום הנוכחי, אם לאותו מקום יש אפילו 'A'. באופן דומה, כל הבריחה
רצפים עבור תווים מסוימים, "\n" למשל, תמיד מתכוונים למקור של הפלטפורמה
אחד. זה אומר, למשל, ש"\N" בביטויים רגולריים (כל תו מלבד חדש-
line) עובד על סט התווים של הפלטפורמה.
החל מגרסה 5.22, Perl כברירת מחדל תזהיר בעת מעבר למקום המגדיר מחדש
כל תו ASCII שניתן להדפסה (בתוספת "\t" ו-"\n") למחלקה שונה מהצפוי.
סביר להניח שזה יקרה במקומות מודרניים רק בפלטפורמות EBCDIC, שבהן, למשל, א
מקום CCSID 0037 במחשב CCSID 1047 מזיז "[", אבל זה יכול לקרות בפלטפורמות ASCII
עם ISO 646 ומקומות אחרים של 7 סיביות שהם למעשה מיושנים. אולי הדברים עדיין
עבודה, תלוי באילו תכונות של Perl משתמשים בתוכנית. לדוגמה, ב-
דוגמה מלמעלה כאשר "|" הופך ל"\w", ואין ביטויים רגולריים איפה
זה משנה, ייתכן שהתוכנית עדיין תעבוד כמו שצריך. האזהרה מפרטת את כל הדמויות
שהוא יכול לקבוע שיכול להיות מושפע לרעה.
הערה: הגדרת אזור "LC_CTYPE" שבורה או זדונית עלולה לגרום לבלתי כשיר בעליל
תווים שנחשבים לאלפאנומריים לפי היישום שלך. להתאמה קפדנית
של אותיות וספרות ASCII (שגרתיות) - לדוגמה, במחרוזות פקודה - מודע למיקום
יישומים צריכים להשתמש ב-"\w" עם משנה הביטוי הרגולרי "/a". ראה "אבטחה".
קטגוריה "LC_NUMERIC": מספרי עיצוב
לאחר קריאה נכונה של "POSIX::setlocale()" ובמסגרת טופס "שימוש מקומי"
הכולל מספרים, Perl מציית למידע המקומי "LC_NUMERIC", השולט ב-
הרעיון של האפליקציה כיצד יש לעצב מספרים לקריאות אנושית. ברוב
יישומים ההשפעה היחידה היא לשנות את התו המשמש עבור העשרוני
נקודה--אולי מ-"." ל ",". הפונקציות אינן מודעות לנחמדות כמו אלפים
הפרדה וכן הלאה. (ראה "פונקציית ה-localeconv" אם אכפת לך מהדברים האלה.)
השתמש ב-POSIX qw(strtod setlocale LC_NUMERIC);
להשתמש באזור;
setlocale LC_NUMERIC, "";
$n = 5/2; # הקצה מספרי 2.5 ל-$n
$a = " $n"; # המרה תלוית מקום למחרוזת
הדפס "חצי חמש זה $n\n"; # פלט תלוי מקומי
printf "חצי חמש זה %g\n", $n; # פלט תלוי מקומי
הדפס "נקודה עשרונית היא פסיק\n"
if $n == (strtod("2,5"))[0]; # המרה תלוית מקום
ראה גם I18N::Langinfo ו-"RADIXCHAR".
קטגוריה "LC_MONETARY": עיצוב of כַּספִּי כמויות
תקן C מגדיר את הקטגוריה "LC_MONETARY", אך לא פונקציה שמושפעת ממנה
התוכן שלו. (בעלי ניסיון בוועדות תקינה יכירו בכך
קבוצת העבודה החליטה להצביע על הנושא.) כתוצאה מכך, פרל בעצם לא
לשים לב לזה. אם אתה באמת רוצה להשתמש ב-"LC_MONETARY", אתה יכול לשאול את התוכן שלו - ראה
"הפונקציה localeconv" - והשתמש במידע שהיא מחזירה באפליקציה שלך
עיצוב משלו של סכומי מטבע. עם זאת, ייתכן בהחלט שתגלה שהמידע,
נפח ומורכב למרות שזה עשוי להיות, עדיין לא לגמרי עונה על הדרישות שלך:
עיצוב מטבעות הוא אגוז קשה לפיצוח.
ראה גם I18N::Langinfo ו-"CRNCYSTR".
"LC_TIME"
פלט מופק על ידי "POSIX::strftime()", שבונה תאריך/שעה מעוצב הניתנים לקריאה אנושית
string, מושפע מהמקום הנוכחי "LC_TIME". לפיכך, במקום צרפתי, הפלט
מיוצר על ידי רכיב הפורמט %B (שם חודש מלא) עבור החודש הראשון של השנה
להיות "janvier". הנה איך לקבל רשימה של שמות חודשים ארוכים במקום הנוכחי:
השתמש ב-POSIX qw(strftime);
עבור (0..11) {
$long_month_name[$_] =
strftime("%B", 0, 0, 0, 1, $_, 96);
}
הערה: "שימוש מקומי" אינו נחוץ בדוגמה זו: "strftime()" היא פונקציית POSIX אשר
משתמש בפונקציית "libc" הסטנדרטית שסופקה על ידי המערכת שתמיד מצייתת ל-"LC_TIME" הנוכחי
אזור.
ראה גם I18N::Langinfo ו-"ABDAY_1".."ABDAY_7", "DAY_1".."DAY_7", "ABMON_1".."ABMON_12",
ו-"ABMON_1".."ABMON_12".
אחר קטגוריות
שאר קטגוריות המקום אינן נמצאות כעת בשימוש על ידי Perl עצמה. אבל שוב שימו לב
שדברים שאיתם פרל מקיימת אינטראקציה עשויים להשתמש בהם, כולל הרחבות מחוץ לתקן
הפצת Perl, ולפי מערכת ההפעלה וכלי השירות שלה. שימו לב במיוחד לזה
ערך המחרוזת של $! והודעות השגיאה שניתנו על ידי כלי עזר חיצוניים עשויות להשתנות
מאת "LC_MESSAGES". אם אתה רוצה לקבל קודי שגיאה ניידים, השתמש ב-%!". ראה ארנו.
אבטחה
למרות שהדיון העיקרי בנושאי אבטחה של Perl ניתן למצוא ב-perlsec, דיון
הטיפול המקומי של פרל לא יהיה שלם אם הוא לא יפנה את תשומת לבך למקום-
בעיות אבטחה תלויות. מקומות - במיוחד במערכות המאפשרות משתמשים ללא הרשאות
לבנות מקומות משלהם - אינם אמינים. מיקום זדוני (או פשוט שבור).
יכול לגרום לאפליקציה המודעה לאזור לתת תוצאות בלתי צפויות. הנה כמה
אפשרויות:
· בדיקות ביטוי רגולרי עבור שמות קבצים בטוחים או כתובות דואר באמצעות "\w" עשוי להיות
מזויף על ידי מיקום "LC_CTYPE" שטוען שתווים כגון ">" ו-"|" הם
אותיות ומספרים.
· אינטרפולציה של מחרוזות עם מיפוי רישיות, כמו למשל, "$dest = "C:\U$name.$ext"", עשויה
לייצר תוצאות מסוכנות אם טבלת מיפוי מקרים מזויפת "LC_CTYPE" מופעלת.
· מקומי "LC_COLLATE" ערמומי עלול לגרום לשמות של תלמידים עם ציונים "D"
מופיעים לפני אלה עם "A".
· אפליקציה שתטרחה להשתמש במידע ב-"LC_MONETARY" עשויה לפרמט
חיובים כאילו היו זיכויים ולהיפך אם המקום הזה הושמד. אוֹ
הוא עשוי לבצע תשלומים בדולר ארה"ב במקום בדולר הונג קונג.
· ניתן לשנות את שמות התאריכים והימים בתאריכים המעוצבים על ידי "strftime()".
יתרון על ידי משתמש זדוני המסוגל לשנות את המקום "LC_DATE". ("תראה - זה אומר שאני
לא היה בבניין ביום ראשון.")
סכנות כאלה אינן מיוחדות למערכת המקומית: כל היבט של יישום
סביבה שעלולה להשתנות בזדון מציגה אתגרים דומים. באופן דומה,
הם אינם ספציפיים ל-Perl: כל שפת תכנות המאפשרת לך לכתוב תוכניות
שמתחשבים בסביבתם חושפים אותך לבעיות אלו.
Perl לא יכולה להגן עליך מכל האפשרויות המוצגות בדוגמאות - אין
תחליף לערנות שלך - אבל כאשר "השתמש במיקום" פעיל, פרל משתמש ב-
מנגנון הכתמה (ראה perlsec) לסימון תוצאות מחרוזות שהופכות לתלויות מקומיות, ו
דבר שעלול להיות לא אמין כתוצאה מכך. להלן סיכום של התנהגות המכתימה של
אופרטורים ופונקציות שעשויות להיות מושפעות מהמקום:
· השוואה מפעילי ("lt", "le", "ge", "gt" ו-"cmp"):
תוצאה סקלרית אמיתית/לא נכונה (או פחות/שווה/גדולה יותר) לעולם אינה נגועה.
· מיפוי מקרים אינטרפולציה (עם "\l", "\L", "\u", "\U", או "\F")
מחרוזת התוצאה המכילה חומר אינטרפולציה מוכתמת אם טופס "שימוש מקומי".
שכוללת "LC_CTYPE" בתוקף.
· תואם מפעיל ("M//"):
תוצאה סקלרית אמיתית/לא נכונה מעולם לא נגועה.
כל תבניות המשנה, נמסרו כתוצאת קונטקסט של רשימה או כ-$1 וכו '., נגועים
אם בתוקף טופס "שימוש מקומי" הכולל את "LC_CTYPE", ואת תבנית המשנה
ביטוי רגולרי מכיל מבנה תלוי מקומי. מבנים אלה כוללים
"\w" (כדי להתאים תו אלפאנומרי), "\W" (תו לא אלפאנומרי), "\b" ו
"\B" (גבול מילה ואי-גבול, התלויים בהתאמה בין "\w" ו-"\W), "\s"
(תו רווח לבן), "\S" (תו ללא רווח לבן), "\d" ו-"\D" (ספרות ו
ללא ספרות), ומחלקות התווים POSIX, כגון "[:alpha:]" (ראה "POSIX
כיתות דמויות" ב-perlrecharclass).
סביר להניח שהדפוס יהיה מותאם ללא רגישות לאותיות גדולות (באמצעות "/i").
היוצא מן הכלל הוא אם כל נקודות הקוד שיש להתאים בדרך זו הן מעל 255 והן כן
אין קפלים תחת חוקי Unicode עד מתחת ל-256. הכתמה לא מתבצעת עבור אלה
כי פרל משתמשת רק בכללי Unicode עבור נקודות קוד כאלה, והכללים האלה הם
זהה לא משנה מה המקום הנוכחי.
משתני הדפוס המותאם, $&, "$`" (לפני התאמה), "$'" (אחרי התאמה) ו-$+ (אחרון
התאמה) גם הם נגועים.
· החלפה מפעיל ("s///"):
התנהגות זהה לאופרטור ההתאמה. כמו כן, האופרנד השמאלי של "=~" הופך
נגוע כאשר בתוקף טופס "שימוש מקומי" הכולל "LC_CTYPE", אם שונה כ-
תוצאה של החלפה המבוססת על התאמת ביטוי רגולרי הכוללת כל אחד מה-
דברים שהוזכרו בפריט הקודם, או של מיפוי מקרים, כגון "\l", "\L","\u",
"\U", או "\F".
· תְפוּקָה עיצוב פונקציות ("printf()" ו-"write()"):
התוצאות לעולם אינן מוכתמות כי אחרת אפילו פלט מהדפסה, למשל
"print(1/7)", צריך להיות מוכתם אם "השתמש במיקום" בתוקף.
· מיפוי מקרים פונקציות ("lc()", "lcfirst()", "uc()", "ucfirst()"):
התוצאות מוכתמות אם בתוקף טופס "שימוש מקומי" הכולל "LC_CTYPE".
· POSIX תלוי מקום פונקציות ("localeconv()", "strcoll()", "strftime()",
"strxfrm()"):
התוצאות לעולם אינן נגועות.
· POSIX אופי בכיתה בדיקות ("POSIX::isalnum()", "POSIX::isalpha()",
"POSIX::isdigit()", "POSIX::isgraph()", "POSIX::islower()", "POSIX::isprint()",
"POSIX::ispunct()", "POSIX::isspace()", "POSIX::isupper()", "POSIX::isxdigit()"):
תוצאות נכונות/לא נכונות לעולם אינן מוכתמות.
שלוש דוגמאות ממחישות הכתמה תלויה מקומית. התוכנית הראשונה, שמתעלמת ממנה
locale, לא יפעל: לא ניתן להשתמש בערך שנלקח ישירות משורת הפקודה כדי לתת שם ל-an
קובץ פלט כאשר בדיקות זיהום מופעלות.
#/usr/local/bin/perl -T
# הפעל עם בדיקת כתמים
# בדיקת שפיות שורת הפקודה הושמטה...
$tainted_output_file = shift;
open(F, ">$tainted_output_file")
או אזהרה "פתיחה של $tainted_output_file נכשלה: $!\n";
ניתן לגרום לתוכנית לפעול על ידי "הלבנת" הערך הנגוע באמצעות רגיל
expression: הדוגמה השנייה - שעדיין מתעלמת ממידע מקומי - פועלת ויוצרת את
קובץ בשם בשורת הפקודה שלו אם הוא יכול.
#/usr/local/bin/perl -T
$tainted_output_file = shift;
$tainted_output_file =~ m%[\w/]+%;
$untainted_output_file = $&;
open(F, ">$untainted_output_file")
או אזהרה "פתיחה של $untainted_output_file נכשלה: $!\n";
השווה זאת עם תוכנית דומה אך מודעת למיקום:
#/usr/local/bin/perl -T
$tainted_output_file = shift;
להשתמש באזור;
$tainted_output_file =~ m%[\w/]+%;
$localized_output_file = $&;
open(F, ">$localized_output_file")
או אזהרה "פתיחה של $localized_output_file נכשלה: $!\n";
תוכנית שלישית זו לא מצליחה לפעול כי $& נגוע: היא תוצאה של התאמה
כולל "\w" בעוד "השתמש במיקום" בתוקף.
הסביבה
PERL_SKIP_LOCALE_INIT
משתנה סביבה זה, זמין החל ב-Perl v5.20, אם מוגדר (לכל
value), אומר לפרל לא להשתמש בשאר משתני הסביבה כדי
אתחול עם. במקום זאת, Perl משתמשת בכל הגדרות המקום הנוכחיות.
זה שימושי במיוחד בסביבות משובצות, ראה "שימוש ב-Perl מוטבע
עם POSIX locales" ב-perlembed.
PERL_BADLANG
מחרוזת שיכולה לדכא את האזהרה של Perl לגבי הגדרות מקומיות שנכשלו ב
סטארט - אפ. כשל יכול להתרחש אם התמיכה המקומית במערכת ההפעלה היא
חסר (שבור) בדרך כלשהי - או אם טעית בהקלדת השם של מקום כאשר אתה
להגדיר את הסביבה שלך. אם משתנה סביבה זה נעדר, או שיש לו a
ערך אחר מאשר "0" או "", Perl תתלונן על כשלים בהגדרת המקום.
הערה: "PERL_BADLANG" רק נותן לך דרך להסתיר את הודעת האזהרה. ה
ההודעה מספרת על בעיה כלשהי בתמיכה המקומית של המערכת שלך, ואתה
צריך לבדוק מה הבעיה.
DPKG_RUNNING_VERSION
במערכות Debian, אם משתנה הסביבה DPKG_RUNNING_VERSION מוגדר (ל
כל ערך), אזהרות הכשל המקומי ידחקו בדיוק כמו עם a
אפס הגדרת PERL_BADLANG. זה נעשה כדי למנוע הצפות של אזהרות מזויפות
במהלך שדרוגי מערכת. לִרְאוֹתhttp://bugs.debian.org/508764>.
משתני הסביבה הבאים אינם ספציפיים ל-Perl: הם חלק מה-
שיטה סטנדרטית (ISO C, XPG4, POSIX 1.c) "setlocale()" לשליטה על
חוות דעת האפליקציה על נתונים. Windows אינו POSIX, אבל Perl מסדר את הדברים הבאים
לעבוד כמתואר בכל מקרה. אם המקום שניתן על ידי משתנה סביבה אינו חוקי,
פרל מנסה את הבא הנמוך ביותר בעדיפות. אם אף אחד מהם אינו חוקי, ב-Windows, המערכת
לאחר מכן נוסה אזור ברירת המחדל. אם כל השאר נכשל, המקום "C" משמש. אם אפילו זה
לא עובד, משהו נשבר קשות, אבל פרל מנסה להתקדם עם מה שלא יהיה
הגדרות מקומיות עשויות להיות.
"LC_ALL" "LC_ALL" הוא משתנה הסביבה המקומית "החלפת הכל". אם מוגדר, זה
עוקף את כל שאר משתני הסביבה המקומית.
"שפה" הערה: "LANGUAGE" היא הרחבה של GNU, היא משפיעה עליך רק אם אתה משתמש ב-
GNU libc. זה המקרה אם אתה משתמש למשל בלינוקס. אם אתה משתמש
יוניקס "מסחריים" אתה כנראה לֹא באמצעות GNU libc ואתה יכול
התעלם מ"LANGUAGE".
עם זאת, במקרה שאתה משתמש ב-"LANGUAGE": זה משפיע על השפה של
הודעות מידע, אזהרה ושגיאה שיוצאות על ידי פקודות (במילים אחרות,
זה כמו "LC_MESSAGES") אבל יש לו עדיפות גבוהה יותר מ-"LC_ALL". יתר על כך,
זה לא ערך בודד אלא "נתיב" (":"-רשימה מופרדת) של שפות
(לא מקומיים). עיין בתיעוד של ספריית GNU "gettext" למידע נוסף
מידע.
"LC_CTYPE" בהיעדר "LC_ALL", "LC_CTYPE" בוחר את המקום של סוג התווים. ב
היעדר גם "LC_ALL" וגם "LC_CTYPE", "LANG" בוחר את סוג התו
אזור.
"LC_COLLATE"
בהעדר "LC_ALL", "LC_COLLATE" בוחר את האיסוף (מיון)
מקומי. בהיעדר גם "LC_ALL" וגם "LC_COLLATE", "LANG" בוחר את
אזור איסוף.
"LC_MONETARY"
בהעדר "LC_ALL", "LC_MONETARY" בוחר את העיצוב הכספי
מקומי. בהעדר "LC_ALL" וגם "LC_MONETARY", "LANG" בוחר את
אזור עיצוב כספי.
"LC_NUMERIC"
בהעדר "LC_ALL", "LC_NUMERIC" בוחר את המקום של הפורמט המספרי.
בהעדר "LC_ALL" וגם "LC_NUMERIC", "LANG" בוחר את המספר
פורמט.
"LC_TIME" בהיעדר "LC_ALL", "LC_TIME" בוחר את עיצוב התאריך והשעה
מקומי. בהיעדר גם "LC_ALL" וגם "LC_TIME", "LANG" בוחר את
אזור עיצוב תאריך ושעה.
"LANG" "LANG" הוא משתנה הסביבה המקומית "לתפוס הכל". אם זה מוגדר, זה כן
משמש כמוצא אחרון אחרי ה-"LC_ALL" הכולל והספציפי לקטגוריה
"LC_פו".
דוגמאות
ה-"LC_NUMERIC" שולט בפלט המספרי:
להשתמש באזור;
השתמש ב-POSIX qw(locale_h); # מייבא את setlocale() ואת קבועי LC_.
setlocale(LC_NUMERIC, "fr_FR") או "סליחה";
printf "%g\n", 1.23; # אם ה"fr_FR" הצליח, כנראה מראה 1,23.
וגם כיצד מנותחים מחרוזות על ידי "POSIX::strtod()" כמספרים:
להשתמש באזור;
השתמש ב-POSIX qw(locale_h strtod);
setlocale(LC_NUMERIC, "de_DE") או "Entschuldigung";
my $x = strtod("2,34") + 5;
הדפס $x, "\n"; # כנראה מציג 7,34.
אורים
מחרוזת "eval" ו "LC_NUMERIC"
eval מחרוזת מנתח את הביטוי שלו כ-Perl סטנדרטי. לכן הוא מצפה ל
נקודה עשרונית כדי להיות נקודה. אם "LC_NUMERIC" מוגדר כך שזה יהיה פסיק במקום זאת, ה-
הניתוח יהיה מבולבל, אולי בשקט.
להשתמש באזור;
השתמש ב-POSIX qw(locale_h);
setlocale(LC_NUMERIC, "fr_FR") או "סליחה";
שלי $a = 1.2;
הדפס eval "$a + 1.5";
הדפס "\n";
מדפיס "13,5". הסיבה לכך היא שבמקום זה, הפסיק הוא תו הנקודה העשרונית.
ה"איוול" מתרחב כך ל:
eval "1,2 + 1.5"
והתוצאה היא לא מה שסביר להניח שציפית. לא נוצרות אזהרות. אם אתה כן
מחרוזת "eval" בטווח של "use locale", במקום זאת, עליך לשנות את "eval"
קו לעשות משהו כמו:
print eval "ללא מיקום; $a + 1.5";
זה מדפיס 2.7.
תוכל גם לא לכלול את "LC_NUMERIC", אם אינך זקוק לו, על ידי
השתמש במקום ':!numeric';
לְאָחוֹר תאימות
גרסאות של Perl לפני 5.004 בעיקר התעלמו ממידע מקומי, בדרך כלל מתנהג כמו
אם משהו דומה למקום "C" תמיד היה בתוקף, גם אם התוכנית
הסביבה הציע אחרת (ראה "פונקציית setlocale"). כברירת מחדל, פרל עדיין
מתנהג כך למען תאימות לאחור. אם אתה רוצה יישום Perl לשלם
תשומת לב למידע מקומי, אתה צריך השתמש בפרגמה "שימוש מקומי" (ראה "השימוש
locale" pragma") או, במקרה הבלתי סביר שתרצה לעשות זאת רק עבור דפוס
התאמה, משנה הביטוי הרגולרי "/l" (ראה "משנים של ערכת תווים" ב-perlre)
להורות לו לעשות זאת.
גרסאות של Perl מ-5.002 עד 5.003 השתמשו במידע "LC_CTYPE" אם זמין; זֶה
כלומר, "\w" אכן הבין מה היו האותיות לפי הסביבה המקומית
משתנים. הבעיה הייתה שלמשתמש לא הייתה שליטה על התכונה: אם ה-C
מקומות נתמכים בספרייה, פרל השתמש בהם.
I18N: איסוף מְיוּשָׁן
בגרסאות של Perl לפני 5.004, איסוף לפי אזור היה אפשרי באמצעות ה-
מודול ספריית "I18N::Collate". מודול זה מיושן מעט ויש להימנע ממנו
ביישומים חדשים. הפונקציונליות "LC_COLLATE" משולבת כעת בליבת Perl
שפה: אפשר להשתמש בנתונים סקלרים ספציפיים לאזור באופן נורמלי לחלוטין עם "שימוש מקומי",
כך שכבר אין צורך ללהטט עם ההתייחסויות הסקלריות של "I18N::Collate".
סוג מְהִירוּת ו זיכרון להשתמש משפיע
ההשוואה והמיון לפי מיקום הוא בדרך כלל איטי יותר ממיון ברירת המחדל; האטות של
נצפו פעמיים עד ארבע פעמים. זה גם יצרוך יותר זיכרון: פעם אחת פרל
משתנה סקלארי השתתף בכל השוואת מחרוזות או פעולת מיון תוך ציית ל-
כללי איסוף מקומיים, זה ייקח פי 3-15 יותר זיכרון מבעבר. (המדויק
מכפיל תלוי בתוכן המחרוזת, במערכת ההפעלה ובמקום.) אלה
החסרונות מוכתבים יותר על ידי היישום של מערכת ההפעלה של מערכת המקום
מאשר על ידי פרל.
בְּחוֹפְשִׁיוּת זמין אזור הגדרות
פרויקט Unicode CLDR מחלץ את חלק ה-POSIX של רבים מהמקומות שלו, זמין ב
http://unicode.org/Public/cldr/latest/
יש אוסף גדול של הגדרות מקומיות ב:
http://std.dkuug.dk/i18n/WG15-collection/locales/
אתה צריך להיות מודע לכך שהוא לא נתמך, ולא נטען שהוא מתאים לכל מטרה.
אם המערכת שלך מאפשרת התקנה של מקומות שרירותיים, ייתכן שתמצא את ההגדרות
שימושיים ככל שיהיו, או כבסיס לפיתוח האזורים שלך.
I18n ו l10n
"אינטרנציונליזציה" מקוצר לעתים קרובות בשם i18n כי האותיות הראשונות והאחרונות שלו הן
מופרדים על ידי שמונה עשר אחרים. (אתה יכול לנחש מדוע ה-interninin ... internaliti ... i18n
נוטה לקבל קיצור.) באותו אופן, "לוקליזציה" מקוצר לעתים קרובות ל- l10n.
An לא מושלם תֶקֶן
ניתן למתוח ביקורת על אינטרנציונליזציה, כפי שהוגדרה בתקני C ו-POSIX
לא שלם, מופרך ובעל רמת פירוט גדולה מדי. (מקומי חל על שלם
תהליך, כאשר אפשר לטעון שיהיה שימושי יותר להחיל אותם על שרשור בודד,
קבוצת חלונות, או מה שלא יהיה.) יש להם גם נטייה, כמו קבוצות סטנדרטים, להתחלק
העולם לאומות, כאשר כולנו יודעים שניתן לחלק את העולם באותה מידה
בנקאים, אופנוענים, גיימרים וכן הלאה.
Unicode ו UTF-8
התמיכה של Unicode היא חדשה החל מגירסת Perl v5.6, ומיושמת באופן מלא יותר
בגרסאות v5.8 ואילך. ראה perluniintro.
החל מ-Perl v5.20, מקומות UTF-8 נתמכים ב-Perl, למעט "LC_COLLATE" (השתמש
Unicode::Collate במקום). אם יש לך Perl v5.16 או v5.18 ואינך יכול לשדרג, אתה יכול להשתמש
השתמש במקום ':not_characters';
כאשר משתמשים בצורה זו של הפרגמה, משתמשים רק בחלקים שאינם אופי של מקומות
על ידי Perl, למשל "LC_NUMERIC". פרל מניח שתרגמת את כל
תווים שעליהם לפעול ב-Unicode (למעשה ערכת התווים המקורית של הפלטפורמה
(ASCII או EBCDIC) בתוספת Unicode). עבור נתונים בקבצים, ניתן לעשות זאת בקלות על ידי גם
מפרט
השתמש ב-':locale' פתוח;
פרגמה זו מסדרת שכל הקלט מהקבצים יתורגמו ל-Unicode מה-
המקום הנוכחי כפי שצוין בסביבה (ראה "סביבה"), וכל הפלטים אל
קבצים שיתורגמו חזרה למקום. (ראה פתוח). על בסיס טיפול בקובץ, אתה
יכול במקום זאת להשתמש במודול PerlIO::locale, או במודול Encode::Locale, שניהם זמינים
מ-CPAN. למודול האחרון יש גם שיטות להקל על הטיפול ב-"ARGV" ו
משתני סביבה, וניתן להשתמש בהם על מחרוזות בודדות. אם אתה יודע שכל שלך
המקומות יהיו UTF-8, כפי שרבים מהם כיום, אתה יכול להשתמש ב- -C מתג שורת הפקודה.
צורה זו של הפרגמה מאפשרת למעשה טיפול חלק במקומות עם Unicode. ה
סדר האיסוף יהיה לפי סדר נקודות קוד Unicode. מומלץ בחום מתי
אתה צריך לסדר ולמיין מחרוזות שאתה משתמש במודול הסטנדרטי Unicode::Collate which
נותן תוצאות טובות בהרבה במקרים רבים ממה שאתה יכול להשיג עם המקום בסגנון הישן
טיפול.
כל המודולים והמתגים שתוארו זה עתה ניתנים לשימוש בגרסה 5.20 עם שימוש פשוט
locale", ואם אזורי הקלט לא יהיו UTF-8, תקבל את הפחות מהאידיאלי
התנהגות, המתוארת להלן, שאתה מקבל עם פרלים לפני גרסה 5.16, או כאשר אתה משתמש במקום
פרגמה ללא הפרמטר ":not_characters" ב-v5.16 ו-v5.18. אם אתה משתמש
אך ורק מקומות UTF-8 בגרסה 5.20 ואילך, שאר הסעיף הזה לא חל עליהם
לך.
ישנם שני מקרים, מקומות מרובים בתים ויחידים. רב-בתים ראשון:
המקום היחיד של ריבוי-בתים (או תווים רחב) ש-Perl עשויה לתמוך בו הוא
UTF-8. זאת בשל הקושי ביישום, העובדה כי UTF-8 באיכות גבוהה
מקומיים מתפרסמים כעת עבור כל אזור בעולם
(<http://unicode.org/Public/cldr/latest/>), וכי נכשל בכל מה שאתה יכול להשתמש ב
מודול קידוד לתרגום אל/מאת המקום שלך. אז תצטרך לעשות אחד מהדברים האלה
אם אתה משתמש באחד מהמקומות האלה, כגון Big5 או Shift JIS. עבור מקומות UTF-8, ב
Perls (קודם גרסה 5.20) שאין להם תמיכה מקומית מלאה של UTF-8, הם עשויים לעבוד בצורה סבירה
(בהתאם ליישום ספריית C שלך) פשוט בגלל שגם הם וגם Perl מאחסנים
תווים שתופסים מספר בתים באותו אופן. עם זאת, חלקם, אם לא רובם, C
יישומי ספרייה עשויים שלא לעבד את התווים במחצית העליונה של ה- Latin-1
טווח (128 - 255) כראוי תחת "LC_CTYPE". כדי לראות אם דמות היא סוג מסוים
תחת מקומי, Perl משתמש בפונקציות כמו "isalnum()". ייתכן שספריית ה-C שלך לא תעבוד עבור
מקומות UTF-8 עם פונקציות אלו, במקום זאת פועלים רק תחת הספרייה הרחבה החדשה יותר
פונקציות כמו "iswalnum()", שבהן Perl אינו משתמש. מקומות מרובים בתים אלה הם
מטופלים כמו מקומיים של בייט בודד, ויהיו להם ההגבלות המתוארות להלן.
החל ב-Perl v5.22 מועלית הודעת אזהרה כאשר Perl מזהה מקום רב-בתים
שזה לא תומך באופן מלא.
עבור מקומות של בייט בודד, Perl בדרך כלל נוקטת בשימוש בכללי מיקום בנקודות קוד
שיכול להתאים לבייט בודד, וכללי Unicode עבור אלה שלא יכולים (אם כי זה לא
מיושם באופן אחיד, ראה הערה בסוף סעיף זה). זה מונע בעיות רבות
במקומות שאינם UTF-8. נניח שהמקום הוא ISO8859-7, יוונית. הדמות ב
0xD7 יש צ'י בירה. אבל במקום ISO8859-1, Latin1, מדובר בכפל
סִימָן. מחלקת התווים של הביטוי הרגולרי של POSIX "[[:alpha:]]" תתאים בצורה קסומה
0xD7 במקום היווני אך לא במקום הלטיני.
עם זאת, יש מקומות שבהם זה מתקלקל. מבני Perl מסוימים מיועדים ל-Unicode
בלבד, כגון "\p{אלפא}". הם מניחים של-0xD7 תמיד יש את משמעות ה-Unicode שלו (או ה
שווה ערך בפלטפורמות EBCDIC). מאז Latin1 הוא תת-קבוצה של Unicode ו-0xD7 הוא
סימן הכפל גם ב- Latin1 וגם ב-Unicode, "\p{Alpha}" לעולם לא יתאים לו,
ללא קשר למקום. בעיה דומה מתרחשת עם "\N{...}". לפני v5.20, זה כן
לכן רעיון רע להשתמש ב-"\p{}" או "\N{}" תחת "שימוש מקומי" רגיל--אלא אם כן אתה יכול
להבטיח שהמקום יהיה ISO8859-1. השתמש במחלקות תו POSIX במקום זאת.
בעיה נוספת בגישה זו היא שפעולות שחוצות את הבתים/הריבוי הבודדים
גבול בתים אינם מוגדרים היטב, ולכן אסורים. (גבול זה הוא בין
נקודות קוד ב-255/256.) לדוגמה, אות קטנה אות לטינית Y עם DIAERESIS
(U+0178) צריך להחזיר אות קטנה לטיני עם DIAERESIS (U+00FF). אבל ביוונית
locale, למשל, אין תו ב-0xFF, ולפרל אין דרך לדעת מה
הדמות ב-0xFF באמת אמורה לייצג. לפיכך הוא פוסל את הפעולה.
במצב זה, האותיות הקטנות של U+0178 היא עצמה.
אותן בעיות נוצרות אם אתה מפעיל אימות UTF-8 אוטומטי של הקובץ הסטנדרטי שלך
ידיות, שכבת ברירת המחדל "open()" ו-@ARGV במקומות שאינם ISO8859-1, שאינם UTF-8 (על ידי שימוש
או -C מתג שורת הפקודה או משתנה הסביבה "PERL_UNICODE"; לִרְאוֹת
perlrun). דברים נקראים בתור UTF-8, מה שבדרך כלל מרמז על Unicode
פרשנות, אך נוכחותו של מקום גורם להם להתפרש באותו מקום
במקום זאת. לדוגמה, נקודת קוד 0xD7 בקלט Unicode, שאמורה להיות ה-
סימן הכפל, לא יתפרש על ידי פרל כך תחת המקום היווני. זֶה
לא בעיה ובלבד אתה מוודא שכל האזורים יהיו תמיד ורק אחד מהם
ISO8859-1, או, אם אין לך ספריית C לקויה, אזור UTF-8.
בעיה נוספת היא שגישה זו יכולה להוביל לשתי נקודות קוד שמשמעותן זהה
אופי. לפיכך באזור יווני, גם U+03A7 וגם U+00D7 הם אותיות רישיות יווניות CHI.
בגלל כל הבעיות הללו, החל מגרסה 5.22, Perl תעלה אזהרה אם
נקודת קוד בייט (ולכן Unicode) משמשת כאשר קיים מיקום של בייט בודד. (למרות ש
זה לא בודק אם פעולה זו תאט את הביצוע בצורה בלתי סבירה.)
מקומות הספק ידועים לשמצה, וקשה לפרל לבדוק את המקום שלה-
טיפול בקוד מכיוון שהוא מקיים אינטראקציה עם קוד שלפרל אין שליטה עליו; לָכֵן
קוד הטיפול המקומי ב- Perl עשוי להיות גם באג. (עם זאת, ה-Unicode מסופק
המקומות צריכים להיות טובים יותר, ויש מנגנון היזון חוזר לתיקון כל בעיה. לִרְאוֹת
"הגדרות מקומיות זמינות באופן חופשי".)
אם יש לך Perl v5.16, הבעיות שהוזכרו לעיל נעלמות אם אתה משתמש ב-
פרמטר ":not_characters" לפרגמת המקום (למעט באגים של ספקים ב-non-
חלקי אופי). אם אין לך v5.16, ואתה do יש מקומות שעובדים, באמצעות
הם עשויים להיות כדאיים למטרות ספציפיות מסוימות, כל עוד אתה לוקח בחשבון את ה
gotchas שכבר הוזכרו. לדוגמה, אם האיסוף עבור המקומות שלך עובד, הוא פועל
מהיר יותר תחת מקומות מאשר תחת Unicode::Collate; ואתה מקבל גישה לדברים כמו
סמל המטבע המקומי ושמות החודשים והימים בשבוע. (אבל ל
hammer home the point, ב-v5.16, אתה מקבל את הגישה הזו ללא החסרונות של מקומיים על ידי
באמצעות הצורה ":not_characters" של הפרגמה.)
הערה: מדיניות השימוש בכללי מקומי עבור נקודות קוד שיכולות להתאים לבייט, ו-Unicode
כללים למי שלא יכולים אינם מיושמים באופן אחיד. לפני גרסה 5.12, זה היה קצת
אַקרַאִי; בגרסה 5.12 הוא הוחל באופן עקבי למדי על התאמת ביטויים רגולריים
למעט מחלקות תווים בסוגריים; בגרסה 5.14 הוא הורחב לכל התאמות הביטוי הרגולרי; ו
ב-v5.16 לפעולות המעטפת כגון "\L" ו-"uc()". לאיסוף, בכל המהדורות
עד כה, הפונקציה "strxfrm()" של המערכת נקראת, וכל מה שהיא עושה זה מה שאתה מקבל.
השתמש ב-perllocale באינטרנט באמצעות שירותי onworks.net