تقنية

detect_encoding في بايثون: هل يتغلب التعليق على BOM؟

BOM UTF-8 وتعليق latin-1 يسببان SyntaxError في detect_encoding
تعارض مرفوض. [1] [2]

طابق إشارتَي الترميز قبل قراءة المصدر. [1] [2]

الخلاصة السريعة

لا؛ تعارض التعليق مع BOM يرفع SyntaxError. [1] [2]

  • أضفنا BOM_UTF8 قبل تعليق coding: latin-1. [1] [2]
  • detect_encoding يرفض هذا التعارض. [1] [2]
  • دون العلامة، يعطي iso-8859-1. [1] [2]
  • تعليق utf-8 المتوافق يعطي مع العلامة utf-8-sig. [1] [2]
  • اختبرنا 3.12.14؛ بايتات في الذاكرة، بلا تنفيذ للمصدر. [1] [2]

المثال

from tokenize import detect_encoding
from io import BytesIO
from codecs import BOM_UTF8
p=b"# coding: latin-1\nx=7\n"
for b in (BOM_UTF8+p,p):
 try:
  r=detect_encoding(
   BytesIO(b).readline)
  print(r[0])
 except SyntaxError:
  print("SyntaxError")

[1] [2]

رفض التعارض

المصدر يفحص العلامة ثم التعليق؛ لا يستبدل ترميزًا بآخر عند التعارض. المخرجان SyntaxError ثم iso-8859-1. يتعرف latin-1 بهذا الاسم المطبّع. [1] [2]

تعليق latin-1 دون BOM معروف وتعليق utf-8 معه متوافق
إشارات متوافقة. [1] [2]

ضبط متوافق

استبدلنا latin-1 بـutf-8 في ضبط مستقل: أعطى utf-8-sig مع العلامة، وutf-8 دونها. هذه نتيجة كشف الترميز؛ لا تثبت صحة بقية الشيفرة. [1] [2]

المراجع

  1. Python 3.12: detect_encoding
  2. CPython 3.12.14: BOM and cookie checks
  3. موضوع تك: لغة بايثون — مفردات
  4. موضوع تك: تطبيقات بايثون — مفردات

للتوسع: بحث عن لغات البرمجة

أُعدّ هذا المقال بمساعدة الذكاء الاصطناعي، وخضع لمراجعة ذاتية بالأداة نفسها. لا يُنسب إلى مراجع بشري أو خبير مستقل. منهجية المحتوى.