4. رشتههای کاراکتری

4.1. اسکریپت [str_01]: نگارش رشتهای
اسکریپت [str_01] به شرح زیر است:
#رشتههای کاراکتری
# سه نگاشت ممکن
chaine1 = "un"
chaine2 = 'deux'
chaine3 = """hélène va au
marché acheter des légumes"""
# نمایش
print(f"chaine1=[{chaine1}], chaine2=[{chaine2}], chaine3=[{chaine3}]")
نظرات
- خط ۳: یک رشته محصور در گیومه دوبل ";
- خط ۴: یک رشته که با گیومهٔ تکی ' محصور شده است؛
- خط ۵: یک رشته محصور شده در سه نقلقول """. در این حالت، رشته ممکن است چندین خط را در بر بگیرد؛
نتایج به شرح زیر است:
C:\Data\st-2020\dev\python\cours-2020\python3-flask-2020\venv\Scripts\python.exe C:/Data/st-2020/dev/python/cours-2020/python3-flask-2020/strings/str_01.py
chaine1=[un], chaine2=[deux], chaine3=[hélène va au
marché acheter des légumes]
Process finished with exit code 0
4.2. اسکریپت [str_02]: متدهای کلاس <str>
اسکریپت [str_02] برخی از متدهای کلاس <str> را نشان میدهد که کلاس رشتههای کاراکتری است:
# عملکردها بر روی رشتههای کاراکتری
# رشتهٔ حروف کوچک
print(f"'ABCD'.lower()={'ABCD'.lower()}")
# رشتهٔ تماماً بزرگ
print(f"'abcd'.upper()={'abcd'.upper()}")
# کاراکتر شمارهٔ ۲
print(f"'cheval[2]={'cheval'[2]}")
#زیر رشتهای شامل کاراکترهای ۵ و ۶
print(f"'caractères accentués'[5:7]={'caractères accentués'[5:7]}")
# زیر رشتهای از کاراکتر ۴ به بعد
print(f"'caractères accentués'[4:]={'caractères accentués'[4:]}")
#زیر رشتهای تا کاراکتر ۶ اما بدون احتساب آن
print(f"'caractères accentués'[:5]={'caractères accentués'[:5]}")
#طول رشته
print(f"len('123')={len('123')}")
# حذف فاصلههای ابتدایی و انتهایی از رشته
print(f"' abcd '.strip()=[{' abcd '.strip()}]")
# حذف فضای خالی پس از رشته
print(f"' abcd '.rstrip()=[{' abcd '.rstrip()}]")
# حذف فضای خالی پیش از رشته
print(f"' abcd '.lstrip()=[{' abcd '.lstrip()}]")
# اصطلاح «فضاهای خالی» در واقع شامل کاراکترهای مختلفی میشود
str = ' \r\nabcd \t\f'
print(f"str.strip()=[{str.strip()}]")
# جایگزینی یک زیر رشته با زیر رشتهٔ دیگر
print(f"'abcd'.replace('a','x')={'abcd'.replace('a', 'x')}")
print(f"'abcd'.replace('ab','xy')={'abcd'.replace('ab', 'xy')}")
#جستجو برای یک زیر رشته: موقعیت را برمیگرداند یا در صورت عدم یافتن زیر رشته، مقدار -1 را برمیگرداند
print(f"'abcd'.find('bc')={'abcd'.find('bc')}")
print(f"'abcd'.find('bc')={'abcd'.find('Bc')}")
# آغاز یک رشته
print(f"'abcd'.startswith('ab')={'abcd'.startswith('ab')}")
print(f"'abcd'.startswith('x')={'abcd'.startswith('x')}")
# پایان یک رشته
print(f"'abcd'.endswith('cd')={'abcd'.endswith('cd')}")
print(f"'abcd'.endswith('x')={'abcd'.endswith('x')}")
#تبدیل از یک لیست رشتهها به یک رشته واحد
print(f"'[X]'.join(['abcd', '123', 'èéà'])={'[X]'.join(['abcd', '123', 'èéà'])}")
print(f"''.join(['abcd', '123', 'èéà'])={''.join(['abcd', '123', 'èéà'])}")
#تبدیل یک رشته به یک لیست از رشتهها
print(f"'abcd 123 cdXY'.split('cd')={'abcd 123 cdXY'.split('cd')}")
#بازیابی کلمات از یک رشته
print(f"'abcd 123 cdXY'.split(None)={'abcd 123 cdXY'.split(None)}")
توضیحات همراه با نتایج بهدستآمده برای درک اسکریپت کافی هستند. نتایج به شرح زیر است:
C:\Data\st-2020\dev\python\cours-2020\python3-flask-2020\venv\Scripts\python.exe C:/Data/st-2020/dev/python/cours-2020/python3-flask-2020/strings/str_02.py
'ABCD'.lower()=abcd
'abcd'.upper()=ABCD
'horse[2]=e
'حروف دارای نشانهٔ diakritیک'[5:7]=tè
'حروف دارای نشانهٔ نگارشی'[4:]=حروف دارای نشانهٔ نگارشی
'حروف دارای نشانهٔ تأکید'[:5]=charac
len('123')=3
' abcd '.strip()=[abcd]
' abcd '.rstrip()=[ abcd]
' abcd '.lstrip()=[abcd ]
str.strip()=[abcd]
'abcd'.replace('a','x')=xbcd
'abcd'.replace('ab','xy')=xycd
'abcd'.find('bc')=1
'abcd'.find('bc')=-1
'abcd'.startswith('ab')=True
'abcd'.startswith('x')=False
'abcd'.endswith('cd')=True
'abcd'.endswith('x')=False
'[X]'.join(['abcd', '123', 'èéà'])=abcdQZXW2HTMLBW1hdZQX123QZXW2HTMLBW1hdZQXèéà
''.join(['abcd', '123', 'èéà'])=abcd123èéà
'abcd 123 cdXY'.split('cd')=['ab', ' 123 ', 'XY']
'abcd 123 cdXY'.split(None) = ['abcd', '123', 'cdXY']
Process finished with exit code 0
4.3. اسکریپت [str_03]: رمزگذاری رشته (۱)
اسکریپت [str_03] مفاهیم مربوط به رمزگذاری رشتهای را معرفی میکند:
# کدگذاری کاراکتر
# رشته
str = "hélène va au marché acheter des légumes"
print(f"str=[{str}, type={type(str)}]")
# کدگذاری UTF-8
print("--- utf-8")
bytes1 = str.encode('utf-8')
print(f"bytes1={bytes1}, type={type(bytes1)}")
bytes2 = bytes(str, 'utf-8')
print(f"bytes2={bytes2}, type={type(bytes2)}")
# کدگذاری iso-8859-1
print("--- iso-8859-1")
bytes1 = str.encode('iso-8859-1')
print(f"bytes1={bytes1}, type={type(bytes1)}")
bytes2 = bytes(str, 'iso-8859-1')
print(f"bytes2={bytes2}, type={type(bytes2)}")
# کدگذاری Latin1 = ISO-8859-1
print("--- latin1")
bytes1 = str.encode('latin1')
print(f"bytes1={bytes1}, type={type(bytes1)}")
bytes2 = bytes(str, 'latin1')
print(f"bytes2={bytes2}, type={type(bytes2)}")
کدگذاری یک رشته کاراکتری از نوع <str>، یک رشته باینری تولید میکند که در آن هر کاراکتر در رشته با یک یا چند بایت نمایش داده میشود. انواع مختلفی از کدگذاری وجود دارد. اسکریپت بالا دو نوع رایج در غرب را ارائه میدهد: «utf-8» و «iso-8859-1» که با نام «latin1» نیز شناخته میشود.
اصل رمزگذاری و رمزگشایی در زیر نشان داده شده است (منبع |https://realpython.com/python-encodings-guide/ |):

نظرات
- خطوط ۴–۵: رشتهٔ کاراکتری اولیه که باید رمزگذاری شود. نمونههای نوع <str> رشتههای یونیکد هستند |https://docs.python.org/3/howto/unicode.html|, |https://realpython.com/python-encodings-guide/ |;
- خطوط ۶–۱۱: دو روش برای رمزگذاری یک رشته با استفاده از UTF68:
- خط ۸: str.encode('utf-8);
- خط ۱۰: bytes(str, 'utf-8');
- خطوط ۱۲–۱۷: ما همین کار را با رمزگذاری 'iso-8859-1' انجام میدهیم؛
- خطوط ۱۸–۲۳: 'latin1' نام دیگری برای رمزگذاری 'iso-8859-1' است؛
نتایج به شرح زیر است:
C:\Data\st-2020\dev\python\cours-2020\python3-flask-2020\venv\Scripts\python.exe C:/Data/st-2020/dev/python/cours-2020/python3-flask-2020/strings/str_03.py
str=[hélène va au marché acheter des légumes, type=<class 'str'>
--- utf-8
bytes1=b'h\xc3\xa9l\xc3\xa8ne va au march\xc3\xa9 acheter des l\xc3\xa9gumes', type=<class 'bytes'>
bytes2=b'h\xc3\xa9l\xc3\xa8ne va au march\xc3\xa9 acheter des l\xc3\xa9gumes', type=<class 'bytes'>
--- iso-8859-1
bytes1=b'h\xe9l\xe8ne va au march\xe9 acheter des l\xe9gumes', type=<class 'bytes'>
bytes2=b'h\xe9l\xe8ne va au march\xe9 acheter des l\xe9gumes', type=<class 'bytes'>
--- latin1
bytes1=b'h\xe9l\xe8ne va au march\xe9 acheter des l\xe9gumes', type=<class 'bytes'>
bytes2=b'h\xe9l\xe8ne va au march\xe9 acheter des l\xe9gumes', type=<class 'bytes'>
Process finished with exit code 0
توضیحات
- خط ۴: میبینیم که کاراکترهای دارای آکسنت با استفاده از دو بایت رمزگذاری شدهاند:
- é: [\xc3\xa9]، که دنبالهٔ دودویی 11000011 10101001 است؛
- è: [\xc3\xa8]، که دنبالهٔ باینری 11000011 10101000 است؛
- خط ۷: با استفاده از رمزگذاری ISO-8859-1، این دو کاراکتر دارای آکسنت به شیوههای متفاوتی رمزگذاری شدهاند:
- é: [\xe9]، که دنبالهٔ دودویی 11101001 است؛
- è: [\xe8]، که دنبالهٔ دودویی 11101000 است؛
4.4. اسکریپت [str_04]: رمزگذاری رشتههای کاراکتری (۲)
اسکریپت [str_04] دو نوع دیگر رمزگذاری را ارائه میدهد: «base64» و «quoted-printable». این دو رمزگذاری رشتههای کاراکتری یونیکد را رمزگذاری نمیکنند، بلکه اشیاء دودویی را رمزگذاری میکنند. برای مثال، هنگامی که یک سند Word به یک ایمیل ضمیمه میشود، بسته به کلاینت ایمیل مورد استفاده، با یکی از این دو روش رمزگذاری خواهد شد. این امر برای اکثر فایلهای ضمیمه شده نیز صادق است.
اسکریپت به شرح زیر است:
# رمزگذاری / رمزگشایی
import codecs
#رشته
print("---- chaîne unicode")
str1 = "hélène va au marché acheter des légumes"
print(f"str1=[{str1}], type(str1)={type(str1)}")
# کدگذاری UTF-8
print("---- chaîne unicode -> binaire utf-8")
bytes1 = bytes(str1, "utf-8")
print(f"bytes1=[{bytes1}], type(bytes1)={type(bytes1)}")
# رمزگشایی UTF-8
print("---- binaire utf-8 -> chaîne unicode")
str2 = bytes1.decode("utf-8")
print(f"str2=[{str2}], type(str2)={type(str2)}")
print(f"str2==str1={str2 == str1}")
# کدگذاری ISO-8859-1
print("---- chaîne unicode -> binaire iso-8859-1")
bytes2 = bytes(str1, "iso-8859-1")
print(f"bytes2=[{bytes2}], type(bytes2)={type(bytes2)}")
# رمزگشایی ISO-8859-1
print("---- binaire iso-8859-1 -> chaîne unicode")
str3 = bytes2.decode("iso-8859-1")
print(f"str3=[{str3}], type(str3)={type(str3)}")
print(f"str3==str1={str3 == str1}")
#خطای رمزگشایی – bytes1 در UTF-8 است – در حال رمزگشایی به ISO-8859-1 است
print("--- binaire utf-8 (décodage iso-8859-1) --> chaîne unicode")
str4 = bytes1.decode("iso-8859-1")
print(f"str4=[{str4}], type(str4)={type(str4)}")
# رمزگذاری UTF-8 یک رشته یونیکد
print("---- chaîne unicode -> binaire utf-8")
bytes3 = codecs.encode(str1, "utf-8")
print(f"bytes3=[{bytes3}], type(bytes3)={type(bytes3)}")
#رمزگذاری Base64 یک رشتهٔ باینری UTF-8
print("---- binaire utf-8 -> binaire base64")
bytes4 = codecs.encode(bytes1, "base64")
print(f"bytes4=[{bytes4}], type(bytes4)={type(bytes4)}")
#بازگشت به رشته یونیکد اصلی
print("---- binaire base64 -> binaire utf-8 -> chaîne unicode")
str6 = codecs.decode(bytes4, "base64").decode("utf-8")
print(f"str6=[{str6}], type(str6)={type(str6)}")
# کدگذاری یک رشتهٔ باینری در قالب quoted-printable
print("---- binaire utf-8 -> binaire quoted-printable")
str7 = codecs.encode(bytes1, "quoted-printable")
print(f"str7=[{str7}], type(str7)={type(str7)}")
#تبدیل مجدد به رشته یونیکد اصلی
print("---- binaire quoted-printable -> binaire utf-8 -> chaîne unicode")
str8 = codecs.decode(str7, "quoted-printable").decode("utf-8")
print(f"str8=[{str8}], type(str8)={type(str8)}")
توضیحات
- خط ۲: ماژول [codecs] رمزگذاریهای «base64» و «quoted-printable» را فعال میکند. این ماژول میتواند بسیاری از روشهای دیگر را نیز انجام دهد؛
- خطوط ۴–۷: رشته یونیکد که باید به روشهای مختلف رمزگذاری شود؛
- خطوط ۹–۱۲: رمزگذاری UTF-8. این کار یک رشتهٔ باینری تولید میکند؛
- خطوط ۱۴–۱۸: رمزگشایی UTF-8 برای بازگشت به رشته یونیکد اصلی؛
- خطوط ۲۰–۲۹: همین فرایند با استفاده از رمزگذاری «iso-8859-1» تکرار میشود؛
- خطوط 31–34: یک خطای رمزگشایی نشان داده شده است:
- خط ۳۳: bytes1 یک رشتهٔ باینری است که با 'utf-8' رمزگذاری شده است. این رشته به 'iso-8859-1' رمزگشایی میشود؛
- خطوط ۳۶–۳۹: روش دیگری برای رمزگذاری یک رشته کاراکتری در UTF-8 با استفاده از ماژول [codecs]؛
- خطوط ۴۱–۴۴: یک رشتهٔ باینری «UTF-8» در «base64» رمزگذاری میشود؛
- خطوط ۴۶–۴۹: نشان میدهند چگونه از رشتهٔ باینری «base64» به رشتهٔ یونیکد اصلی بازگردیم؛
- خطوط ۵۱–۵۹: این فرآیند با استفاده از رمزگذاری «quoted-printable» به جای «base64» تکرار میشود؛
نتایج به شرح زیر است:
C:\Data\st-2020\dev\python\cours-2020\python3-flask-2020\venv\Scripts\python.exe C:/Data/st-2020/dev/python/cours-2020/python3-flask-2020/strings/str_04.py
---- chaîne unicode
str1=[hélène va au marché acheter des légumes], type(str1)=<class 'str'>
---- chaîne unicode -> binaire utf-8
bytes1=[b'h\xc3\xa9l\xc3\xa8ne va au march\xc3\xa9 acheter des l\xc3\xa9gumes'], type(bytes1)=<class 'bytes'>
---- binaire utf-8 -> chaîne unicode
str2=[hélène va au marché acheter des légumes], type(str2)=<class 'str'>
str2==str1=True
---- chaîne unicode -> binaire iso-8859-1
bytes2=[b'h\xe9l\xe8ne va au march\xe9 acheter des l\xe9gumes'], type(bytes2)=<class 'bytes'>
---- binaire iso-8859-1 -> chaîne unicode
str3=[hélène va au marché acheter des légumes], type(str3)=<class 'str'>
str3==str1=True
--- binaire utf-8 (décodage iso-8859-1) --> chaîne unicode
str4=[hélène va au marché acheter des légumes], type(str4)=<class 'str'>
---- chaîne unicode -> binaire utf-8
bytes3=[b'h\xc3\xa9l\xc3\xa8ne va au march\xc3\xa9 acheter des l\xc3\xa9gumes'], type(bytes3)=<class 'bytes'>
---- binaire utf-8 -> binaire base64
bytes4=[b'aMOpbMOobmUgdmEgYXUgbWFyY2jDqSBhY2hldGVyIGRlcyBsw6lndW1lcw==\n'], type(bytes4)=<class 'bytes'>
---- binaire base64 -> binaire utf-8 -> chaîne unicode
str6=[hélène va au marché acheter des légumes], type(str6)=<class 'str'>
---- binaire utf-8 -> binaire quoted-printable
str7=[b'h=C3=A9l=C3=A8ne=20va=20au=20march=C3=A9=20acheter=20des=20l=C3=A9gumes'], type(str7)=<class 'bytes'>
---- binaire quoted-printable -> binaire utf-8 -> chaîne unicode
str8=[hélène va au marché acheter des légumes], type(str8)=<class 'str'>
Process finished with exit code 0
- خطوط 14–15: یک رشتهٔ باینری UTF-8 با استفاده از دیکودر نادرست «iso-8859-1» به یک رشتهٔ یونیکد تبدیل میشود. در نتیجه، برخی از کاراکترهای یونیکد تولید شده نادرست هستند؛ در این مورد، کاراکترهای دارای علامت؛
- خطوط ۱۸–۱۹: رمزگذاری «base64» شامل استفاده از ۶۴ کاراکتر ASCII (رمزگذاریشده بر روی ۷ بیت) برای رمزگذاری هرگونه دادهٔ باینری است. همانطور که مشاهده میشود، این امر اندازهٔ رشتهٔ باینری را افزایش میدهد؛
- خطوط ۲۲–۲۳: رمزگذاری «quoted-printable» نیز شامل استفاده از کاراکترهای ASCII (رمزگذاریشده با ۷ بیت) برای رمزگذاری هرگونه دادهٔ باینری است؛
باید توجه داشت که هنگامی که یک فایل باینری – برای مثال از اینترنت – دریافت میشود که نماینده متن است، رمزگذاریهایی که بر روی آن انجام شده است باید برای بازیابی متن شناخته شوند.