ترميز Base64 في Python: دليل b64encode الكامل
استخدم مشفّر Base64 عبر الإنترنت المجاني مباشرةً في متصفحك — لا حاجة للتثبيت.
جرّب مشفّر Base64 عبر الإنترنت أونلاين ←عند بناء خدمات Python تُمرِّر بيانات اعتماد في ترويسات HTTP Basic Auth، أو تُضمِّن أصولًا ثنائية في استجابات API، أو تخزِّن شهادات TLS في متغيرات البيئة، ستجد نفسك تكتب كود Python لترميز Base64 بانتظام. تأتي Python مع وحدة base64 في المكتبة القياسية — دون الحاجة إلى pip — غير أن الفرق بين البايت والسلسلة النصية والاختلاف بين b64encode و urlsafe_b64encode و encodebytes يُربِك المطورين أكثر مما تتوقع. للترميز السريع دون كتابة أي كود، مشفِّر Base64 من ToolDeck يُنجز ذلك فورًا في المتصفح. يتناول هذا الدليل واجهة stdlib الكاملة، والترميز الآمن للـ URL للـ JWTs، وسيناريوهات الملفات واستجابات API، واختصارات CLI، وبديلًا عالي الأداء، وأربعة أخطاء أراها كثيرًا أثناء مراجعة الكود.
- ✓base64.b64encode() تتوقع bytes وليس str — استدعِ دائمًا .encode("utf-8") على السلسلة النصية قبل تمريرها
- ✓القيمة المُعادة أيضًا bytes — استدعِ .decode("utf-8") أو .decode("ascii") للحصول على str عادية يمكن تضمينها في JSON أو ترويسات HTTP
- ✓base64.urlsafe_b64encode() تستبدل + بـ - و / بـ _ لكنها تحتفظ بمحرف الحشو = — احذفه يدويًا باستخدام .rstrip("=") لمقاطع JWT
- ✓base64.encodebytes() تُدرج \n كل 76 محرفًا (تنسيق MIME) — لا تستخدمها أبدًا لمعرّفات URI للبيانات أو حقول JSON أو متغيرات البيئة
- ✓pybase64 (امتداد C، واجهة برمجية متوافقة) يُشفِّر بسرعة أعلى 2–10 مرات من المكتبة القياسية؛ مفيد للخدمات عالية الإنتاجية
ما هو ترميز Base64؟
يُحوِّل Base64 البيانات الثنائية التعسفية إلى سلسلة نصية مبنية من 64 محرف ASCII قابلًا للطباعة: A–Z وa–z و0–9 و + و /. تُعيَّن كل 3 بايتات من المدخلات إلى 4 محارف Base64 بالضبط. إذا لم يكن طول المدخلات من مضاعفات 3، يُلحَق محرف حشو واحد أو اثنان =. يكون الإخراج المُرمَّز دائمًا أكبر بنحو 33% من الأصل.
Base64 ليس تشفيرًا — لا يوفر أي سرية على الإطلاق. الغرض منه هو أمان النقل: صُمِّمت كثير من البروتوكولات وأنظمة التخزين لنص ASCII ذي 7 بتات ولا يمكنها نقل بايتات ثنائية تعسفية بأمان. يسدّ Base64 هذه الفجوة. تشمل حالات الاستخدام الشائعة في Python: ترويسات HTTP Basic Auth، ومعرّفات URI للبيانات لتضمين الصور في HTML أو CSS، ومقاطع رمز JWT، ومرفقات MIME في البريد الإلكتروني، وتمرير الكتل الثنائية عبر متغيرات البيئة أو واجهات JSON API.
ZGVwbG95LXN2Yzpzay1wcm9kLTlmMmExYzNlOGI0ZA==
deploy-svc:sk-prod-9f2a1c3e8b4d
base64.b64encode() — دليل الترميز القياسي مع أمثلة
base64.b64encode(s, altchars=None) هي دالة الترميز الرئيسية في stdlib الخاص بـ Python. توجد في وحدة base64 المرفقة مع كل تثبيت Python. تقبل الدالة كائنًا من نوع bytes وتُعيد كائنًا من نوع bytes يحتوي على تمثيل ASCII Base64. يفترض هذا الدليل استخدام Python 3.x (3.6+) طوال الوقت.
مثال أدنى قابل للتشغيل
import base64
# ترميز زوج من بيانات اعتماد API لترويسة HTTP Basic Auth
service_id = "deploy-svc"
api_key = "sk-prod-9f2a1c3e8b4d"
credential_bytes = f"{service_id}:{api_key}".encode("utf-8")
encoded_bytes = base64.b64encode(credential_bytes)
encoded_str = encoded_bytes.decode("ascii") # bytes → str
print(encoded_str)
# ZGVwbG95LXN2Yzpzay1wcm9kLTlmMmExYzNlOGI0ZA==
import urllib.request
req = urllib.request.Request("https://api.internal/v1/deployments")
req.add_header("Authorization", f"Basic {encoded_str}")
# قيمة الترويسة: Basic ZGVwbG95LXN2Yzpzay1wcm9kLTlmMmExYzNlOGI0ZA==مثال موسَّع — sort_keys، كائنات متداخلة، فك ترميز ذهاب وإياب
import base64
import json
# ترميز إعدادات خادم منظَّمة لمتغير بيئة
server_config = {
"host": "db-primary.eu-west-1.internal",
"port": 5432,
"database": "analytics_prod",
"max_connections": 150,
"ssl": {
"mode": "verify-full",
"cert_path": "/etc/ssl/certs/db-client.crt",
"reject_self_signed": True,
},
}
config_json = json.dumps(server_config, sort_keys=True)
encoded_bytes = base64.b64encode(config_json.encode("utf-8"))
encoded_str = encoded_bytes.decode("ascii")
print(encoded_str[:60] + "...")
# eyJkYXRhYmFzZSI6ICJhbmFseXRpY3NfcHJvZCIsICJob3N0IjogImRi...
# فك الترميز والتحقق من رحلة الذهاب والإياب
decoded_json = base64.b64decode(encoded_str).decode("utf-8")
restored = json.loads(decoded_json)
print(restored["host"]) # db-primary.eu-west-1.internal
print(restored["ssl"]["mode"]) # verify-fullb64decode() متسامح بشكل افتراضي — يتجاهل بصمت المحارف غير الصالحة بما فيها المسافات وفواصل الأسطر. مرِّر validate=True لإثارة binascii.Error عند أي محرف خارج Base64. استخدم هذا عند فك ترميز مدخلات غير موثوقة من أنظمة خارجية.ترميز السلاسل النصية غير ASCII وUnicode في Python
سلاسل Python 3 هي Unicode بشكل افتراضي. وحدة base64 تعمل على bytes وليس على str — لذا يجب عليك ترميز السلسلة إلى بايتات قبل تمريرها. اختيار الترميز مهم: يتعامل UTF-8 مع كل نقطة ترميز Unicode وهو الخيار الافتراضي الصحيح لمعظم حالات الاستخدام.
import base64
# ترميز محتوى متعدد اللغات — أسماء العرض للمستخدمين من منصة دولية
user_names = [
"أحمد العمري", # عربي — Unicode
"田中太郎", # رموز CJK الأيديوغرافية — 3 بايت لكل منها في UTF-8
"Мария Соколова", # سيريلي — U+041C فما فوق
"فاطمة السيد", # عربي — Unicode
]
for name in user_names:
encoded = base64.b64encode(name.encode("utf-8")).decode("ascii")
decoded = base64.b64decode(encoded).decode("utf-8")
print(f"الأصلي : {name}")
print(f"مُرمَّز : {encoded}")
print(f"ذهاب وإياب: {decoded}")
print(f"تطابق : {name == decoded}")
print()
# الأصلي : Мария Соколова
# مُرمَّز : 0JzQsNGA0LjRjyDQodC+0LrQvtC70L7QstCw
# ذهاب وإياب: Мария Соколова
# تطابق : Trueوحدة base64 — مرجع الدوال
تعرض وحدة base64 عدة دوال ترميز. إليك المرجع الكامل للدوال التي ستصادفها عمليًا:
| الدالة | المدخل | المُعاد | الوصف |
|---|---|---|---|
| b64encode(s, altchars=None) | bytes | bytes | Base64 قياسي (RFC 4648 §4). يستبدل altchars محرفَي + و/ ببايتين مخصصين. |
| b64decode(s, altchars=None, validate=False) | bytes | str | bytes | يفك ترميز Base64 القياسي. validate=True يُثير binascii.Error عند محارف مدخلات غير صالحة. |
| urlsafe_b64encode(s) | bytes | bytes | Base64 الآمن للـ URL (RFC 4648 §5). يستخدم - و_ بدلاً من + و/. يحتفظ بالحشو =. |
| urlsafe_b64decode(s) | bytes | str | bytes | يفك ترميز Base64 الآمن للـ URL. يقبل المدخلات المحشوة وغير المحشوة. |
| encodebytes(s) | bytes | bytes | MIME Base64: يُدرج \n كل 76 محرفًا ويُلحق \n نهائيًا. للبريد الإلكتروني/MIME فقط. |
| decodebytes(s) | bytes | bytes | يفك ترميز MIME Base64. يتجاهل المسافات وفواصل الأسطر المضمَّنة. |
| b16encode(s) | bytes | bytes | ترميز سداسي عشري (Base16). كل بايت يصبح محرفين سداسيين بأحرف كبيرة. لا حشو. |
| b32encode(s) | bytes | bytes | ترميز Base32. يستخدم A–Z و2–7. إخراج أكبر من Base64؛ يُستخدم في أسرار TOTP. |
معامل altchars في b64encode يقبل كائنًا من بايتين يستبدل محرفَي + و /. تمرير altchars=b'-_' ينتج إخراجًا مطابقًا لـ urlsafe_b64encode لكنه يتيح لك التحكم في الحشو بشكل منفصل.
Base64 الآمن للـ URL — urlsafe_b64encode() للـ JWTs ومعاملات الاستعلام
يستخدم Base64 القياسي + و /، وكلاهما محارف محجوزة في URLs. يُفسَّر + في سلسلة استعلام كمسافة، و/ هو فاصل مسار. عندما تظهر القيمة المُرمَّزة في URL أو اسم ملف أو cookie، تحتاج إلى الصيغة الآمنة للـ URL: urlsafe_b64encode() تستبدل - بـ + و _ بـ /.
تستخدم JWTs Base64 الآمن للـ URL بدون حشو للمقاطع الثلاثة (الترويسة، والحمولة، والتوقيع). يجب إزالة الحشو يدويًا — يحتفظ به stdlib الخاص بـ Python.
ترميز مقطع حمولة JWT
import base64
import json
def encode_jwt_segment(data: dict) -> str:
"""رمِّز قاموسًا كسلسلة Base64 آمنة للـ URL بدون حشو (تنسيق JWT)."""
json_bytes = json.dumps(data, separators=(",", ":")).encode("utf-8")
return base64.urlsafe_b64encode(json_bytes).rstrip(b"=").decode("ascii")
def decode_jwt_segment(segment: str) -> dict:
"""افكّ ترميز مقطع JWT Base64 الآمن للـ URL (يعالج الحشو المفقود)."""
# أضف الحشو مجددًا: يتطلب Base64 أن يكون الطول من مضاعفات 4
padding = 4 - len(segment) % 4
padded = segment + ("=" * (padding % 4))
raw = base64.urlsafe_b64decode(padded)
return json.loads(raw)
# بناء ترويسة JWT وحمولتها
header = {"alg": "HS256", "typ": "JWT"}
payload = {
"sub": "usr_7c3a9f1b2d",
"workspace": "ws_eu-west-1-prod",
"role": "data-engineer",
"iat": 1741824000,
"exp": 1741910400,
}
header_segment = encode_jwt_segment(header)
payload_segment = encode_jwt_segment(payload)
print(header_segment)
# eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
print(payload_segment)
# eyJzdWIiOiJ1c3JfN2MzYTlmMWIyZCIsIndvcmtzcGFjZSI6IndzX2...
# التحقق من رحلة الذهاب والإياب
restored = decode_jwt_segment(payload_segment)
print(restored["role"]) # data-engineerurlsafe_b64decode() يقبل المدخلات المحشوة وغير المحشوة اعتبارًا من Python 3.x، لكن فقط إذا كانت المحارف آمنة للـ URL (- و _). لا تمرر أبدًا سلسلة Base64 قياسية (تحتوي على + أو /) إلى urlsafe_b64decode — المحارف غير المتطابقة ستسبب تلف بيانات صامت أو binascii.Error.ترميز الملفات واستجابات API في Python
في كود الإنتاج، يظهر ترميز Base64 في الغالب حول الملفات المُرسَلة وحول استجابات واجهات API الخارجية التي تُقدِّم محتوى ثنائيًا. يتطلب كلا السيناريوين معالجة دقيقة لحدود البايت.
قراءة ملف من القرص وترميزه
import base64
import json
from pathlib import Path
def encode_file_to_base64(file_path: str) -> str:
"""اقرأ ملفًا ثنائيًا وأعِد تمثيله المُرمَّز بـ Base64."""
try:
raw_bytes = Path(file_path).read_bytes()
return base64.b64encode(raw_bytes).decode("ascii")
except FileNotFoundError:
raise FileNotFoundError(f"الملف غير موجود: {file_path}")
except PermissionError:
raise PermissionError(f"تم رفض إذن القراءة: {file_path}")
# إرفاق شهادة TLS ببيان نشر
cert_b64 = encode_file_to_base64("./ssl/service-client.crt")
deployment_manifest = {
"service": "payment-processor",
"environment": "production",
"region": "eu-west-1",
"tls": {
"client_cert": cert_b64,
"cert_format": "base64-pem",
},
}
# كتابة البيان — الشهادة مضمَّنة بأمان كسلسلة نصية
with open("./dist/deployment-manifest.json", "w") as f:
json.dump(deployment_manifest, f, indent=2)
print(f"تم ترميز الشهادة: {len(cert_b64)} محرف")ترميز استجابة HTTP API لأغراض التصحيح
import base64
import requests # pip install requests
def fetch_and_encode_binary(url: str, headers: dict | None = None) -> str:
"""جلب مورد ثنائي من API وإعادته كـ Base64."""
response = requests.get(url, headers=headers or {}, timeout=10)
response.raise_for_status() # يُثير HTTPError لـ 4xx/5xx
content_type = response.headers.get("Content-Type", "unknown")
encoded = base64.b64encode(response.content).decode("ascii")
print(f"نوع المحتوى : {content_type}")
print(f"الحجم الخام : {len(response.content):,} بايت")
print(f"الحجم المُرمَّز: {len(encoded):,} محرف")
return encoded
# مثال: تنزيل فاتورة PDF موقَّعة من API فوترة داخلي
invoice_b64 = fetch_and_encode_binary(
"https://billing.internal/api/v2/invoices/INV-2026-0042/pdf",
headers={"Authorization": "Bearer eyJhbGc..."},
)
# إرفاقها بحمولة إشعار
notification = {
"recipient_id": "team-finance",
"invoice_id": "INV-2026-0042",
"attachment": {
"filename": "invoice-2026-0042.pdf",
"content": invoice_b64,
"content_type": "application/pdf",
"encoding": "base64",
},
}
print(f"الحمولة جاهزة: {len(str(notification)):,} محرف")كيفية ترميز ملف صورة بـ Base64 في Python
ترميز صورة إلى Base64 وتضمينها كـ URI للبيانات هو النهج القياسي لقوالب البريد الإلكتروني HTML ومولِّدات PDF ولقطات HTML المكتفية بذاتها. يُفسِّر المتصفح السلسلة المُرمَّزة مباشرةً — لا يلزم طلب صورة منفصل. يعمل نفس النمط مع أي نوع ملف ثنائي: PNG وJPEG وSVG وWebP وPDF.
import base64
import mimetypes
from pathlib import Path
def image_to_data_uri(image_path: str) -> str:
"""حوِّل ملف صورة إلى URI للبيانات Base64 للتضمين المباشر في HTML."""
path = Path(image_path)
mime_type = mimetypes.guess_type(image_path)[0] or "image/octet-stream"
raw_bytes = path.read_bytes()
encoded = base64.b64encode(raw_bytes).decode("ascii")
return f"data:{mime_type};base64,{encoded}"
# تضمين صور المنتج مباشرةً في قالب بريد إلكتروني HTML
hero_uri = image_to_data_uri("./assets/product-hero-768px.png")
thumbnail_uri = image_to_data_uri("./assets/product-thumb-128px.webp")
html_fragment = f"""
<img src="{hero_uri}"
alt="صورة رئيسية للمنتج"
width="768" height="432"
style="display:block;max-width:100%" />
"""
print(f"يبدأ URI بيانات PNG بـ: {hero_uri[:60]}...")
# data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAwAAAAA...data:image/svg+xml,{encoded}) أصغر من Base64 لأن SVG نصي وBase64 يُضخِّم الحجم بنحو 33%. استخدم Base64 للتنسيقات النقطية (PNG وJPEG وWebP) وترميز URL للـ SVG.العمل مع الملفات الكبيرة — ترميز Base64 المُجزَّأ
تحميل ملف كامل في الذاكرة باستخدام Path.read_bytes() مناسب للملفات حتى ~50 ميجابايت. فوق ذلك العتبة، يصبح ذروة استخدام الذاكرة كبيرًا — ملف 200 ميجابايت يتطلب ~200 ميجابايت للبايتات الخام بالإضافة إلى ~267 ميجابايت لإخراج Base64، بإجمالي ~467 ميجابايت في عملية واحدة. للملفات الكبيرة، اقرأ ورمِّز على أجزاء.
القيد الحاسم: يجب أن يكون حجم الجزء مضاعفًا لـ 3 بايت. يُرمِّز Base64 3 بايتات مدخلة في 4 محارف مخرجة بالضبط. إذا وقع حد الجزء على غير مضاعف لـ 3، يُلحق المشفِّر محارف حشو = في منتصف الدفق، مما يجعل الإخراج المتسلسل غير صالح.
ترميز تدفقي إلى ملف (بدون تحميل الملف كاملًا في الذاكرة)
import base64
from pathlib import Path
CHUNK_SIZE = 3 * 1024 * 256 # 786,432 بايت — مضاعف لـ 3، ~768 كيلوبايت لكل جزء
def encode_large_file(input_path: str, output_path: str) -> int:
"""
رمِّز ملفًا ثنائيًا كبيرًا إلى Base64 دون تحميله كاملًا في الذاكرة.
يُعيد عدد محارف Base64 المكتوبة.
"""
total_chars = 0
with open(input_path, "rb") as src, open(output_path, "w") as dst:
while True:
chunk = src.read(CHUNK_SIZE)
if not chunk:
break
encoded_chunk = base64.b64encode(chunk).decode("ascii")
dst.write(encoded_chunk)
total_chars += len(encoded_chunk)
return total_chars
# ترميز فيديو منتج 300 ميجابايت لبيان تسليم الأصول
chars_written = encode_large_file(
"./uploads/product-demo-4k.mp4",
"./dist/product-demo-4k.b64",
)
print(f"مُرمَّز: {chars_written:,} محرف Base64")
# مُرمَّز: 407,374,184 محرف Base64ترميز دليل من الأصول الثنائية (إخراج NDJSON)
import base64
import json
from pathlib import Path
def encode_assets_to_ndjson(asset_dir: str, output_path: str) -> int:
"""
رمِّز جميع الملفات الثنائية في دليل إلى بيان NDJSON.
كل سطر كائن JSON: {"path": "...", "mime": "...", "data": "<base64>"}
يُعيد عدد الملفات المعالَجة.
"""
import mimetypes
asset_path = Path(asset_dir)
count = 0
with open(output_path, "w") as out:
for file_path in sorted(asset_path.rglob("*")):
if not file_path.is_file():
continue
mime = mimetypes.guess_type(str(file_path))[0] or "application/octet-stream"
encoded = base64.b64encode(file_path.read_bytes()).decode("ascii")
record = {"path": str(file_path.relative_to(asset_path)), "mime": mime, "data": encoded}
out.write(json.dumps(record) + "\n")
count += 1
return count
processed = encode_assets_to_ndjson("./dist/static/", "./dist/asset-bundle.ndjson")
print(f"تم ترميز {processed} ملفًا في حزمة أصول NDJSON")read_bytes() إلى القراءة المُجزَّأة عندما يتجاوز ملف المدخل ~50–100 ميجابايت، أو عندما تعالج خدمتك ملفات كثيرة في آنٍ واحد ويصبح ضغط الذاكرة مصدر قلق. للملفات الأقل من 50 ميجابايت، السطر الأحادي الأبسط b64encode(path.read_bytes()).decode() أسرع وأسهل في الفهم.ترميز Base64 من سطر الأوامر باستخدام Python
تأتي Python مع واجهة CLI لوحدة base64 — لا حاجة لأدوات إضافية. تعمل عبر الأنظمة، مما يجعلها مفيدة في أنابيب CI وبيئات Windows حيث قد لا يكون أمر نظام base64 متاحًا.
# ── python -m base64 ─────────────────────────────────────────────────── # ترميز سلسلة (عبر stdin) echo -n "deploy-svc:sk-prod-9f2a1c3e8b4d" | python3 -m base64 # ZGVwbG95LXN2Yzpzay1wcm9kLTlmMmExYzNlOGI0ZA== # ترميز ملف python3 -m base64 ./ssl/service-client.crt # فك ترميز سلسلة Base64 echo "ZGVwbG95LXN2Yzpzay1wcm9kLTlmMmExYzNlOGI0ZA==" | python3 -m base64 -d # فك ترميز ملف Base64 إلى ثنائي python3 -m base64 -d ./dist/service-client.b64 > ./restored.crt # ── سطر Python أحادي — عبر الأنظمة، يعمل على Windows ──────────────── # ترميز سلسلة python3 -c "import base64,sys; print(base64.b64encode(sys.argv[1].encode()).decode())" "my-secret" # bXktc2VjcmV0 # ترميز آمن للـ URL (بدون حشو) python3 -c "import base64,sys; print(base64.urlsafe_b64encode(sys.argv[1].encode()).rstrip(b'=').decode())" "my-secret" # bXktc2VjcmV0 # ترميز ملف مباشرةً (النتيجة على stdout) python3 -c "import base64,sys; print(base64.b64encode(open(sys.argv[1],'rb').read()).decode())" ./config.json
base64، python -m base64 لا يلف الإخراج عند 76 محرفًا بشكل افتراضي. الإخراج سطر واحد غير منقطع، وهو ما تريده لمتغيرات البيئة وحقول JSON وترويسات HTTP. استخدمه كبديل للنظام base64 على أي نظام تشغيل.بديل عالي الأداء: pybase64
وحدة stdlib base64 في Python مُنفَّذة بـ Python الخالص (مع طبقة C رفيعة في CPython). للخدمات التي تُرمِّز حمولات كبيرة بإنتاجية عالية — أنابيب معالجة الصور، ومهام التصدير الضخم، واستيعاب قياسات عن بُعد في الوقت الفعلي — pybase64 هو بديل متوافق مدعوم بمكتبة C مسرَّعة بـ SIMD تُسمَّى libbase64. تُظهر المعايير تحسينات في الإنتاجية من 2 إلى 10 أضعاف بحسب حجم الحمولة ومعمارية المعالج.
pip install pybase64
import pybase64
import time
# pybase64 بديل متوافق — نفس توقيعات الدوال في stdlib
sample_payload = b"x" * (1024 * 1024) # 1 ميجابايت من البيانات الثنائية
# ترميز قياسي — إخراج مطابق لـ base64.b64encode()
encoded = pybase64.b64encode(sample_payload)
decoded = pybase64.b64decode(encoded)
assert decoded == sample_payload
# ترميز آمن للـ URL — إخراج مطابق لـ base64.urlsafe_b64encode()
url_safe = pybase64.urlsafe_b64encode(sample_payload)
# b64encode_as_string() تُعيد str مباشرةً — لا داعي لاستدعاء .decode()
telemetry_event = b'{"event":"page_view","session_id":"sess_3a7f91c2","ts":1741824000}'
encoded_str: str = pybase64.b64encode_as_string(telemetry_event)
print(encoded_str[:48] + "...")
# eyJldmVudCI6InBhZ2VfdmlldyIsInNlc3Npb25faWQi...
# مقارنة الإنتاجية (تقريبية، تتفاوت بحسب العتاد)
# stdlib base64.b64encode(1 MB): ~80 MB/s
# pybase64.b64encode(1 MB): ~800 MB/s (مسار SIMD على معالج AVX2)انتقل إلى pybase64 عندما يُظهر التحليل أن ترميز Base64 هو عنق الزجاجة، أو عندما تُرمِّز حمولات تتجاوز ~100 كيلوبايت بشكل متكرر. لترميز السلاسل الصغيرة لمرة واحدة (بيانات الاعتماد والرموز المميزة)، فإن stdlib سريع بما يكفي ولا يتطلب تثبيت أي تبعية.
إخراج الطرفية مع تمييز بناء الجملة
عند تصحيح حمولات مُرمَّزة بـ Base64 في الطرفية — لا سيما إعدادات JSON أو محتويات JWT — تمنحك مكتبة rich إخراجًا مميَّز بنحوٍ مع مسافات بادئة يسهل قراءته بكثير من المفرغ الخام. مفيد بشكل خاص في أدوات CLI ونصوص التصحيح وجلسات REPL.
pip install rich
import base64
import json
from rich import print as rprint
from rich.syntax import Syntax
from rich.console import Console
console = Console()
def decode_and_pretty_print(encoded: str, label: str = "الحمولة المفككة") -> None:
"""افكّ ترميز سلسلة Base64 وحلِّلها كـ JSON واطبعها مع تمييز بناء الجملة."""
raw_bytes = base64.b64decode(encoded + "==") # حشو متسامح
try:
parsed = json.loads(raw_bytes)
pretty = json.dumps(parsed, indent=2, ensure_ascii=False)
syntax = Syntax(pretty, "json", theme="monokai", line_numbers=False)
console.rule(f"[bold blue]{label}")
console.print(syntax)
except json.JSONDecodeError:
# ليس JSON — اطبع النص الخام
console.rule(f"[bold yellow]{label} (نص خام)")
rprint(raw_bytes.decode("utf-8", errors="replace"))
# فحص مقطع حمولة JWT من طلب مصادقة فاشل
jwt_payload_segment = "eyJzdWIiOiJ1c3JfN2MzYTlmMWIyZCIsInJvbGUiOiJkYXRhLWVuZ2luZWVyIiwiZXhwIjoxNzQxOTEwNDAwfQ"
decode_and_pretty_print(jwt_payload_segment, "حمولة JWT")rich فقط لعرض الطرفية — للتصحيح أو التسجيل في stdout أو أدوات CLI التفاعلية. لا تستخدمه أبدًا لكتابة إخراج Base64 في ملفات أو إعادته من نقاط نهاية API أو تخزينه في متغيرات البيئة، إذ يُضيف rich رموز هروب ANSI تُفسد البيانات.الأخطاء الشائعة
راجعت قواعد كود Python كثيرة تتضمن ترميز Base64، وتظهر هذه الأخطاء الأربعة بانتظام — غالبًا دون اكتشافها حتى تصل مدخلات غير ASCII أو ملف ثنائي إلى مسار الترميز في الإنتاج.
الخطأ 1 — تمرير str بدلاً من bytes إلى b64encode()
المشكلة: b64encode() تتوقع كائنًا من نوع bytes. تمرير str يُثير فورًا TypeError: a bytes-like object is required. الحل: استدعِ دائمًا .encode("utf-8") على السلسلة قبل الترميز.
import base64
# ✅ رمِّز str إلى bytes أولًا
webhook_secret = "wh-secret-a3f91c2b4d"
encoded = base64.b64encode(webhook_secret.encode("utf-8"))
# b'd2gtc2VjcmV0LWEzZjkxYzJiNGQ='import base64 # ❌ TypeError: a bytes-like object is required, not 'str' webhook_secret = "wh-secret-a3f91c2b4d" encoded = base64.b64encode(webhook_secret) # تتعطل
الخطأ 2 — نسيان استدعاء .decode() على نتيجة bytes
المشكلة: b64encode() تُعيد bytes وليس str. تضمينها مباشرةً في f-string ينتج b'...' في الإخراج، وهي قيمة ترويسة HTTP غير صالحة وتكسر تسلسل JSON. الحل: استدعِ دائمًا .decode("ascii") على النتيجة المُرمَّزة.
import base64
credential = base64.b64encode(b"svc-monitor:sk-7f3a1b").decode("ascii")
# ✅ Authorization: Basic c3ZjLW1vbml0b3I6c2stN2YzYTFi
headers = {"Authorization": f"Basic {credential}"}import base64
credential = base64.b64encode(b"svc-monitor:sk-7f3a1b")
# ❌ ترويسة Authorization تحتوي على "b'c3ZjLW1vbml0b3I6c2stN2YzYTFi'"
headers = {"Authorization": f"Basic {credential}"}الخطأ 3 — استخدام encodebytes() حيث تلزم b64encode()
المشكلة: encodebytes() تُدرج \n كل 76 محرفًا (لف سطر MIME) وتُلحق سطرًا نهائيًا. تخزين هذا في حقل JSON أو متغير بيئة أو URI للبيانات يُدرج محارف سطر جديد حرفية تُفسد القيمة. الحل: استخدم b64encode() في كل مكان إلا عند إنشاء بريد إلكتروني MIME.
import base64, json
from pathlib import Path
cert_bytes = Path("./ssl/root-ca.crt").read_bytes()
# ✅ b64encode() تنتج سلسلة واحدة غير منقطعة
cert_b64 = base64.b64encode(cert_bytes).decode("ascii")
config = json.dumps({"ca_cert": cert_b64}) # قيمة سطر واحد نظيفةimport base64, json
cert_bytes = open("./ssl/root-ca.crt", "rb").read()
# ❌ encodebytes() تضيف \n كل 76 محرفًا — تكسر JSON ومتغيرات البيئة
cert_b64 = base64.encodebytes(cert_bytes).decode()
config = json.dumps({"ca_cert": cert_b64}) # أسطر جديدة داخل قيمة السلسلةالخطأ 4 — فك ترميز Base64 الآمن للـ URL باستخدام فاك الترميز القياسي
المشكلة: يستخدم Base64 الآمن للـ URL - و _ بدلاً من + و /. تمرير سلسلة آمنة للـ URL إلى b64decode() ينتج بايتات خاطئة بصمت لأي مقطع يحتوي على تلك المحارف — لا يُثار أي استثناء بشكل افتراضي. الحل: استخدم urlsafe_b64decode() للمدخلات الآمنة للـ URL، أو مرِّر validate=True لاكتشاف عدم التطابق مبكرًا.
import base64
# ✅ استخدم urlsafe_b64decode() للـ JWT والمدخلات الآمنة للـ URL
jwt_segment = "eyJzdWIiOiJ1c3JfN2MzYTlmMWIyZCIsInJvbGUiOiJhZG1pbiJ9"
padding = 4 - len(jwt_segment) % 4
raw = base64.urlsafe_b64decode(jwt_segment + "=" * (padding % 4))
# b'{"sub":"usr_7c3a9f1b2d","role":"admin"}'import base64 # ❌ مقطع حمولة JWT يستخدم Base64 الآمن للـ URL (- و_) # b64decode() تنتج بايتات خاطئة بصمت لتلك المحارف jwt_segment = "eyJzdWIiOiJ1c3JfN2MzYTlmMWIyZCIsInJvbGUiOiJhZG1pbiJ9" wrong = base64.b64decode(jwt_segment) # خاطئ بصمت إذا كانت - أو _ موجودة
طرق Python Base64 — مقارنة سريعة
| الطريقة | أنواع المدخل | محارف آمنة للـ URL | الحشو | فواصل الأسطر | تُعيد | يتطلب تثبيت |
|---|---|---|---|---|---|---|
| b64encode() | bytes, bytearray, memoryview | ❌ + و/ | ✅ حشو = | ❌ لا يوجد | bytes | لا |
| urlsafe_b64encode() | bytes, bytearray, memoryview | ✅ - و_ | ✅ حشو = | ❌ لا يوجد | bytes | لا |
| b64encode(altchars=b"-_") | bytes, bytearray, memoryview | ✅ محرفان مخصصان | ✅ حشو = | ❌ لا يوجد | bytes | لا |
| encodebytes() | bytes, bytearray, memoryview | ❌ + و/ | ✅ حشو = | ✅ \n كل 76 محرفًا | bytes | لا |
| pybase64.b64encode() | bytes, bytearray, memoryview | ❌ + و/ | ✅ حشو = | ❌ لا يوجد | bytes | pip install |
| pybase64.b64encode_as_string() | bytes, bytearray, memoryview | ❌ + و/ | ✅ حشو = | ❌ لا يوجد | str | pip install |
اختر b64encode() لغالبية حالات الاستخدام: ترويسات HTTP وحقول JSON ومتغيرات البيئة ومعرّفات URI للبيانات. انتقل إلى urlsafe_b64encode() متى ظهرت القيمة في URL أو اسم ملف أو cookie أو مقطع JWT. استخدم encodebytes() فقط عند إنشاء مرفقات MIME للبريد الإلكتروني — لف السطر مطلوب بموجب مواصفة MIME لكنه سيكسر كل شيء آخر بصمت. الجأ إلى pybase64 عند ترميز حمولات تتجاوز ~100 كيلوبايت في مسار حرج.
الأسئلة الشائعة
الأدوات ذات الصلة
للترميز أو فك الترميز بنقرة واحدة دون كتابة أي Python، الصق سلسلتك أو ملفك مباشرةً في مشفِّر Base64 — يعالج الوضعين القياسي والآمن للـ URL فورًا في متصفحك دون الحاجة إلى أي إعداد.
Maria is a backend developer specialising in Python and API integration. She has broad experience with data pipelines, serialisation formats, and building reliable server-side services. She is an active member of the Python community and enjoys writing practical, example-driven guides that help developers solve real problems without unnecessary theory.
Priya is a data scientist and machine learning engineer who has worked across the full Python data stack — from raw data ingestion and cleaning to model deployment and monitoring. She is passionate about reproducible research, Jupyter-based workflows, and the practical engineering side of ML. She writes about NumPy, Pandas, data serialisation, and the Python patterns that make data pipelines reliable at scale.