این دستور perlunifaq است که می تواند در ارائه دهنده هاست رایگان OnWorks با استفاده از یکی از چندین ایستگاه کاری آنلاین رایگان ما مانند Ubuntu Online، Fedora Online، شبیه ساز آنلاین ویندوز یا شبیه ساز آنلاین MAC OS اجرا شود.
برنامه:
نام
perlunifaq - سوالات متداول Perl Unicode
Q و A
این لیستی از پرسش ها و پاسخ ها در مورد یونیکد در پرل است که بعد از آن خوانده می شود
perlunitut.
perlunitut نه واقعا a یونیکد آموزش ، is آن؟
نه، و این واقعاً یک سؤال متداول یونیکد نیست.
Perl یک رابط انتزاعی برای همه رمزگذاری های کاراکترهای پشتیبانی شده دارد، بنابراین اینطور است
در واقع یک آموزش عمومی "Encode" و "Encode" سوالات متداول. اما بسیاری از مردم فکر می کنند که یونیکد
خاص و جادویی است، و من نمی خواستم آنها را ناامید کنم، بنابراین تصمیم گرفتم با آن تماس بگیرم
یک آموزش یونیکد را مستند کنید.
چی شخصیت رمزگذاری ها میکند پرل پشتیبانی؟
برای اینکه بدانید پرل شما از کدام رمزگذاری کاراکتر پشتیبانی می کند، اجرا کنید:
perl -MEncode -le "print for Encode->encodings(':all')"
برای نسخه of پرل باید I استفاده کنید؟
خوب، اگر می توانید، به جدیدترین، اما مطمئناً 5.8.1 یا جدیدتر ارتقا دهید. آموزش
و سوالات متداول آخرین نسخه را فرض کنید.
همچنین باید ماژول های خود را بررسی کنید و در صورت لزوم آنها را ارتقا دهید. مثلا،
HTML::Entities به نسخه >= 1.32 نیاز دارد تا به درستی عمل کند، حتی با وجود تغییرات
در این مورد سکوت کرده است
چی در باره دوتایی داده ها، پسندیدن تصاویر؟
خوب، جدا از یک "binmode $fh"، نباید به طور خاص با آنها رفتار کنید. (حالت بین
مورد نیاز است زیرا در غیر این صورت Perl ممکن است انتهای خطوط را در سیستم های Win32 تبدیل کند.)
اما مراقب باشید که هرگز رشته های متنی را با رشته های باینری ترکیب نکنید. اگر به متن نیاز دارید
یک جریان باینری، رشته های متنی خود را ابتدا با استفاده از رمزگذاری مناسب رمزگذاری کنید، سپس بپیوندید
آنها را با رشته های باینری. همچنین ببینید: "اگر رمزگذاری نکنم چه می شود؟".
چه زمانی باید I کشف کردن or رمزگذاری؟
هر زمان که متنی را با هر چیزی که خارج از فرآیند پرل شما است ارتباط برقرار می کنید،
مانند یک پایگاه داده، یک فایل متنی، یک سوکت یا یک برنامه دیگر. حتی اگر چیزی که شما هستید
ارتباط با نیز به زبان پرل نوشته شده است.
چی if I نکن رمزگشایی؟
هر زمان که رشته کدگذاری شده و باینری شما همراه با یک رشته متن استفاده می شود، Perl فرض می کند
رشته باینری شما با ISO-8859-1 کدگذاری شده است که به نام latin-1 نیز شناخته می شود. اگر نبود
latin-1، سپس داده های شما به طرز ناخوشایندی تبدیل می شود. به عنوان مثال، اگر UTF-8 بود،
بایت های منفرد از کاراکترهای چند بایتی به عنوان کاراکترهای جداگانه دیده می شوند و سپس دوباره
به UTF-8 تبدیل شد. چنین کدگذاری دوگانه را می توان با کدگذاری دوگانه HTML مقایسه کرد
(">")، یا کدگذاری URI دوگانه (%253E).
این رمزگشایی ضمنی بی صدا به عنوان "ارتقا" شناخته می شود. ممکن است مثبت به نظر برسد، اما اینطور است
بهتر است از آن اجتناب کنید
چی if I نکن رمزگذاری؟
رشته متن شما با استفاده از بایت ها در قالب داخلی پرل ارسال می شود. در بعضی موارد،
پرل با یک هشدار دوستانه به شما هشدار می دهد که دارید کار اشتباهی انجام می دهید:
نویسه گسترده در چاپ در example.pl خط 2.
از آنجا که فرمت داخلی اغلب UTF-8 است، تشخیص این اشکالات دشوار است، زیرا UTF-8 است
معمولا رمزگذاری مورد نظر شما! اما تنبل نباشید و از واقعیت پرل استفاده نکنید
فرمت داخلی UTF-8 به نفع شماست. برای جلوگیری از اشکالات عجیب و غریب، به صراحت رمزگذاری کنید
به برنامه نویسان تعمیر و نگهداری نشان دهید که به این موضوع فکر کرده اید.
Is آنجا a راه به بطور خودکار کشف کردن or رمزگذاری؟
اگر تمام دادههایی که از یک دسته خاص به دست میآیند دقیقاً به یک روش رمزگذاری شدهاند، میتوانید
به سیستم PerlIO بگویید که به طور خودکار همه چیز را با لایه "رمزگذاری" رمزگشایی کند. اگر
اگر این کار را انجام دهید، دیگر نمی توانید به طور تصادفی رمزگشایی یا رمزگذاری را در مواردی که استفاده می کنند فراموش کنید
دسته لایه ای
شما می توانید این لایه را هنگام "باز کردن" فایل ارائه دهید:
باز کردن $fh من، '>:encoding(UTF-8)', $filename; # رمزگذاری خودکار در نوشتن
باز کردن $fh من، '<:encoding(UTF-8)'، $filename; # رمزگشایی خودکار در هنگام خواندن
یا اگر از قبل یک فایل handle باز دارید:
binmode $fh, ':encoding(UTF-8)';
برخی از درایورهای پایگاه داده برای DBI همچنین می توانند به طور خودکار رمزگذاری و رمزگشایی کنند، اما اینطور است
گاهی اوقات به رمزگذاری UTF-8 محدود می شود.
چی if I نکن دانستن که پشتیبانی می کند بود استفاده شده؟
هر کاری می توانید انجام دهید تا متوجه شوید، و اگر لازم است: حدس بزنید. (فراموش نکنید که خود را مستند کنید
با یک نظر حدس بزنید.)
می توانید سند را در یک مرورگر وب باز کنید و مجموعه کاراکترها یا نویسه ها را تغییر دهید
رمزگذاری تا زمانی که بتوانید به صورت بصری تأیید کنید که همه کاراکترها آنطور که باید به نظر می رسند.
هیچ راهی برای شناسایی قابل اعتماد رمزگذاری به صورت خودکار وجود ندارد، بنابراین اگر مردم به ارسال ادامه دهند
داده های شما بدون نشانه مجموعه نویسه، ممکن است مجبور شوید آنها را آموزش دهید.
قوطی I استفاده کنید یونیکد in my پرل منابع؟
بله، تو میتونی! اگر منابع شما دارای کد UTF-8 هستند، می توانید آن را با "استفاده از utf8" نشان دهید
پراگما
استفاده از utf8؛
این هیچ کاری به ورودی یا خروجی شما نمیکند. این فقط روش شما را تحت تأثیر قرار می دهد
منابع خوانده می شود میتوانید از یونیکد در لفظ رشتهای، در شناسهها استفاده کنید (اما آنها هنوز هم هستند
باید "کاراکترهای کلمه" مطابق "\w") و حتی در جداکننده های سفارشی باشد.
داده:: دامپر نمی کند بازیابی la UTF8 پرچم؛ is it شکسته شده؟
خیر، Data::Dumper's Unicode توانایی های آن طوری است که باید باشد. برخی بوده اند
شکایت دارد که باید پرچم UTF8 را پس از خواندن دوباره داده ها با "eval" بازیابی کند.
با این حال، شما واقعاً نباید به پرچم نگاه کنید، و هیچ چیز نشان دهنده آن Data::Dumper نیست
باید این قانون را زیر پا بگذارد
اتفاقی که می افتد این است: وقتی پرل در یک رشته به معنای واقعی کلمه می خواند، به رمزگذاری 8 بیتی می چسبد.
تا زمانی که بتواند (اما شاید در ابتدا به صورت داخلی به عنوان UTF-8 کدگذاری شده بود، زمانی که شما
زمانی که باید آن را رها کند زیرا کاراکترهای دیگری به متن اضافه شده است
رشته، بی صدا رشته را به UTF-8 ارتقا می دهد.
اگر رشته های خود را برای خروجی به درستی رمزگذاری کنید، هیچ یک از اینها نگران شما نیست و شما
می تواند مانند همیشه داده های ریخته شده را "ارزیابی" کند.
چرا do regex شخصیت کلاس ها گاهی همخوانی داشتن فقط in la ASCII دامنه؟
با شروع در Perl 5.14 (و تا حدی در Perl 5.12)، فقط یک ویژگی استفاده را قرار دهید
"unicode_strings" نزدیک به ابتدای برنامه شما. در محدوده واژگانی آن شما
نباید این مشکل را داشته باشد همچنین به طور خودکار تحت "استفاده از ویژگی ':5.12'" فعال می شود.
یا "use v5.12" یا استفاده از "-E" در خط فرمان برای Perl 5.12 یا بالاتر.
دلیل نیاز به این امر این است که برنامههای قدیمیتری را که در راه هستند شکسته نشوند
همه چیز قبل از ظهور یونیکد کار می کرد. آن برنامه های قدیمی فقط در مورد ASCII می دانستند
مجموعه کاراکترها، و بنابراین ممکن است برای کاراکترهای اضافی به درستی کار نکند. وقتی یک رشته است
کدگذاری شده در UTF-8، Perl فرض می کند که برنامه برای مقابله با یونیکد آماده است، اما زمانی که
رشته اینطور نیست، پرل فرض می کند که فقط ASCII مورد نظر است، و بنابراین آن کاراکترهایی که هستند
کاراکترهای نه ASCII در یونیکد شناسایی نمی شوند. "از ویژگی استفاده کنید
«unicode_strings» به پرل میگوید که با همه کاراکترها به عنوان یونیکد رفتار کند، چه رشته
کدگذاری شده در UTF-8 یا نه، بنابراین از مشکل جلوگیری می شود.
با این حال، در پرلهای قبلی، یا اگر رشتههایی را به زیرروالهای خارج از ویژگی ارسال کنید
scope، می توانید قوانین یونیکد را با تغییر رمزگذاری به UTF-8 با انجام این کار مجبور کنید
"utf8::upgrade($string)". این را می توان با خیال راحت در هر رشته ای استفاده کرد، زیرا بررسی می کند و نمی کند
رشته هایی که قبلا ارتقا یافته اند را تغییر دهید.
برای بحث دقیق تر، Unicode::Semantics در CPAN را ببینید.
چرا do برخی از کاراکتر نه بزرگ or حروف کوچک به درستی؟
پاسخ س previousال قبلی را ببینید.
چگونه می توان I مشخص کردن if a رشته is a متن رشته or a دوتایی رشته؟
شما نمی توانید. برخی برای این کار از پرچم UTF8 استفاده می کنند، اما این سوء استفاده است و باعث می شود رفتار خوبی داشته باشد
ماژول هایی مانند Data::Dumper ظاهر بدی دارند. پرچم برای این منظور بی فایده است، زیرا خاموش است
هنگامی که یک رمزگذاری 8 بیتی (به طور پیش فرض ISO-8859-1) برای ذخیره رشته استفاده می شود.
این چیزی است که شما، برنامه نویس، باید آن را پیگیری کنید. متاسف. می توانید در نظر بگیرید
برای کمک به این امر، نوعی «نشانگذاری مجارستانی» را اتخاذ کرد.
چگونه do I تبدیل از جانب پشتیبانی می کند FOO به پشتیبانی می کند بار؟
با تبدیل رشته بایت کدگذاری شده با FOO به رشته متنی و سپس رشته متنی
به یک رشته بایت کدگذاری شده با BAR:
my $text_string = decode('FOO', $foo_string);
my $bar_string = encode('BAR', $text_string);
یا با پرش از قسمت رشته متن و رفتن مستقیم از یک کدگذاری باینری به قسمت
دیگر:
از Encode qw (from_to) استفاده کنید.
from_to($string، 'FOO'، 'BAR'); # محتوای string $ را تغییر می دهد
یا با اجازه دادن به رمزگشایی و رمزگذاری خودکار همه کارها را انجام دهد:
$foofh، '<:encoding(FOO)'، 'example.foo.txt';
باز کردن $barfh، '>:encoding(BAR)', 'example.bar.txt';
print { $barfh } $_ while <$foofh>;
چی هستند "decode_utf8" و "encode_utf8"؟
اینها نحوهای جایگزین برای "decode('utf8', ...)" و "encode('utf8', ...)" هستند.
چی is a "وسیع شخصیت"؟
این اصطلاح برای کاراکترهایی است که بیش از یک بایت را اشغال می کنند.
اخطار پرل "شخصیت گسترده در ..." ناشی از چنین شخصیتی است. بدون مشخص شده
لایه رمزگذاری، پرل سعی می کند چیزها را در یک بایت جا دهد. وقتی نمی تواند، این را ساطع می کند
هشدار (در صورت فعال بودن هشدارها)، و به جای آن از داده های رمزگذاری شده UTF-8 استفاده می کند.
برای جلوگیری از این هشدار و جلوگیری از داشتن کدهای خروجی مختلف در یک جریان واحد،
همیشه یک رمزگذاری را به طور صریح مشخص کنید، به عنوان مثال با یک لایه PerlIO:
binmode STDOUT، ":encoding(UTF-8)";
داخلی
چی is " UTF8 پرچم"؟
لطفاً، مگر اینکه در حال هک کردن داخلی ها یا اشکال زدایی موارد عجیب و غریب هستید، به این موضوع فکر نکنید.
اصلا پرچم UTF8. این بدان معنی است که شما احتمالاً نباید از "is_utf8"، "_utf8_on" یا استفاده کنید
اصلاً "_utf8_off".
پرچم UTF8 که SvUTF8 نیز نامیده میشود، یک پرچم داخلی است که نشاندهنده جریان است
نمایش داخلی UTF-8 است. بدون پرچم، ISO-8859-1 فرض می شود. پرل
به طور خودکار بین اینها تبدیل می شود. (در واقع پرل معمولاً نمایندگی را بر عهده می گیرد
ASCII است. ببینید "چرا کلاس های کاراکتر regex گاهی اوقات فقط در محدوده ASCII مطابقت دارند؟"
در بالا.)
یکی از فرمت های داخلی پرل اتفاقا UTF-8 است. متأسفانه پرل نمی تواند a را نگه دارد
راز، بنابراین همه در مورد این می دانند. این منشأ بسیاری از سردرگمی هاست. بهتر است
وانمود کنید که فرمت داخلی یک کدگذاری ناشناخته است و شما همیشه مجبور هستید
رمزگذاری و رمزگشایی صریح.
چی در باره la "استفاده کنید بایت" پراگما؟
از آن استفاده نکنید. پرداختن به بایت ها در یک رشته متن منطقی نیست و بی معنی است
برای برخورد با کاراکترها در یک رشته بایت. تبدیل های مناسب را انجام دهید (توسط
رمزگشایی/رمزگذاری)، و همه چیز به خوبی پیش خواهد رفت: شما تعداد کاراکترها را برای رمزگشایی دریافت می کنید
داده ها و تعداد بایت ها برای داده های رمزگذاری شده.
«استفاده از بایت ها» معمولاً تلاشی ناموفق برای انجام کاری مفید است. فراموشش کن.
چی در باره la "استفاده کنید رمزگذاری" پراگما؟
از آن استفاده نکنید. متأسفانه، فرض می کند که محیط برنامه نویس و محیط برنامه نویس
کاربر از همان رمزگذاری استفاده خواهد کرد. از همان رمزگذاری برای کد منبع و برای استفاده می کند
STDIN و STDOUT. وقتی یک برنامه در ماشین دیگری کپی می شود، کد منبع کپی نمی شود
تغییر کند، اما محیط STDIO ممکن است.
اگر به کاراکترهای غیر ASCII در کد منبع خود نیاز دارید، آن را به یک فایل رمزگذاری شده UTF-8 تبدیل کنید و
"استفاده از utf8".
اگر نیاز به تنظیم رمزگذاری برای STDIN، STDOUT، و STDERR دارید، برای مثال بر اساس
محل کاربر، "استفاده از باز".
چی is la تفاوت میان ":encoding" و ":utf8"؟
از آنجایی که UTF-8 یکی از فرمت های داخلی پرل است، اغلب می توانید از رمزگذاری صرفنظر کنید یا
مرحله رمزگشایی، و مستقیماً پرچم UTF8 را دستکاری کنید.
به جای ":encoding(UTF-8)"، می توانید به سادگی از ":utf8" استفاده کنید، که مرحله رمزگذاری را رد می کند.
اگر داده ها قبلاً به صورت UTF8 در داخل نمایش داده می شد. این به طور گسترده به عنوان خوب پذیرفته شده است
رفتار هنگام نوشتن، اما هنگام خواندن می تواند خطرناک باشد، زیرا باعث می شود
وقتی توالی بایت نامعتبر دارید، ناسازگاری داخلی است. استفاده از ":utf8" برای ورودی می تواند
گاهی اوقات منجر به نقض امنیت می شود، بنابراین لطفاً به جای آن از ":encoding(UTF-8)" استفاده کنید.
به جای "decode" و "encode"، می توانید از "_utf8_on" و "_utf8_off" استفاده کنید، اما این
سبک بد در نظر گرفته شده است به خصوص "_utf8_on" می تواند خطرناک باشد، به همان دلیل
":utf8" می تواند.
میانبرهایی برای oneliners وجود دارد. -C را در perlrun ببینید.
چه خبر la تفاوت میان "UTF-8" و "utf8"؟
"UTF-8" استاندارد رسمی است. "utf8" روش پرل برای لیبرال بودن در آن است
می پذیرد. اگر مجبور به برقراری ارتباط با چیزهایی هستید که چندان آزادانه نیستند، ممکن است بخواهید
استفاده از "UTF-8" را در نظر بگیرید. اگر مجبورید با چیزهایی که خیلی آزادانه هستند ارتباط برقرار کنید، شما
ممکن است مجبور به استفاده از "utf8" باشد. توضیحات کامل در Encode است.
"UTF-8" در داخل به عنوان "utf-8-strict" شناخته می شود. این آموزش از UTF-8 به طور مداوم و حتی یکنواخت استفاده می کند
جایی که utf8 در واقع به صورت داخلی استفاده می شود، زیرا ایجاد تمایز می تواند دشوار باشد، و
بیشتر بی ربط است
به عنوان مثال، utf8 را می توان برای نقاط کدی که در یونیکد وجود ندارند، مانند 9999999 استفاده کرد.
اما اگر آن را به UTF-8 رمزگذاری کنید، یک کاراکتر جایگزین دریافت می کنید (به طور پیش فرض؛ ببینید
برای روشهای بیشتر برای مقابله با این، «دسترسی به دادههای نادرست» در Encode.)
بسیار خوب، اگر اصرار دارید: "فرمت داخلی" utf8 است، نه UTF-8. (زمانی که دیگری نباشد
رمزگذاری.)
I از دست رفته مسیر؛ چی پشتیبانی می کند is la داخلی قالب واقعا؟
خوب است که مسیر را از دست دادید، زیرا نباید به فرمت داخلی وابسته باشید
هر کدگذاری خاص اما چون پرسیدید: به طور پیش فرض فرمت داخلی یکی است
ISO-8859-1 (لاتین-1)، یا utf8، بسته به تاریخچه رشته. در EBCDIC
پلتفرم ها، این ممکن است حتی متفاوت باشد.
پرل می داند که چگونه رشته را در داخل ذخیره کرده است، و زمانی که شما از آن دانش استفاده می کنید
"رمزگذاری". به عبارت دیگر: سعی نکنید رمزگذاری داخلی مشخصی را پیدا کنید
رشته است، اما در عوض فقط آن را در رمزگذاری مورد نظر خود رمزگذاری کنید.
با استفاده از خدمات onworks.net از perlunifaq آنلاین استفاده کنید