ما الترميز الذي يحوّل 测试 إلى 娴嬭瘯؟
UTF-8 → GBK بايتات UTF-8 قُرئت على أنها GBK. فالبايتات الستة (E6 B5 8B E8 AF 95) يُعاد تجميعها في ثلاثة محارف GBK.
الصق نصاً مشوّهاً واسترجع أصله. تُجرَّب كل سلسلة ترميز محتملة — UTF-8 وGBK وBig5 وShift_JIS وEUC-KR وWindows-1252 — وتُرتَّب النتائج مع بيان السلسلة وراء كل واحدة. مجاني ويعمل كلياً داخل متصفحك.
الصق النص المشوّه. تُجرَّب كل سلسلة ترميز معقولة وتُرتَّب النتائج — لا تحتاج إلى معرفة أي ترميز أفسده.
测试
UTF-8 → GBK
娴å¬ç˜¯
Windows-1252 / Latin-1 → UTF-8
测试
Windows-1252 / Latin-1 → GBK
测试
Windows-1251 → GBK
انظر إلى النص نفسه بايتاتٍ في كل الترميزات الشائعة دفعة واحدة — مفيد حين تحتاج إلى معرفة ما ستخزّنه قاعدة بياناتك أو بروتوكولك بالضبط.
| الترميز | عدد البايتات | ست عشري |
|---|---|---|
| UTF-8 | 6 | E4 B8 AD E6 96 87 |
| GBK | 4 | D6 D0 CE C4 |
| GB18030 | 4 | D6 D0 CE C4 |
| Big5 | 4 | A4 A4 A4 E5 |
| Shift_JIS | 4 | 92 86 95 B6 |
| EUC-KR | 4 | F1 E9 D9 FE |
بناه وتحقّق منه فريق هندسة Go Tools.
UTF-8 → GBK بايتات UTF-8 قُرئت على أنها GBK. فالبايتات الستة (E6 B5 8B E8 AF 95) يُعاد تجميعها في ثلاثة محارف GBK.
UTF-8 → Windows-1252 بايتات UTF-8 نفسها قُرئت على أنها Windows-1252. ولأن ذلك الترميز أحادي البايت، صار كل بايت من الستة محرفاً مستقلاً.
غير قابل للاسترجاع لا. تلك البايتات أُسقطت لحظة فك الترميز. استرجع ما تستطيع من النص المحيط وعُد إلى المصدر لأخذ الباقي.
3 مقابل 2 بايت ثلاثة في UTF-8، واثنان في GBK وBig5. وهذا الفرق مصدر شائع للاقتطاع حين يُحدَّد طول العمود بالبايتات لا بالمحارف.
النص المشوّه هو ما تحصل عليه حين يُكتب نصٌّ بترميز محارف ويُقرأ بترميز آخر. البايتات سليمة، والخطأ في التأويل وحده. وهذا التمييز هو سبب إمكان الاسترجاع أصلاً: إن استطعت تحديد الترميز الذي كتب البايتات والترميز الذي أساء قراءتها، أمكنك تشغيل الخطأ بالمقلوب واستعادة النص الأصلي.
والكلمة يابانية — 文字化け، أي «تحوّل المحارف» تقريباً — وصارت المصطلح المعتمد في الإنجليزية (mojibake) لأن المشكلة كانت متوطّنة في الحوسبة اليابانية قبل يونيكود بزمن طويل. والنصوص الصينية واليابانية والكورية تعاني منها أكثر بكثير من النصوص اللاتينية، لسبب بنيوي: تلك اللغات تحتاج ترميزات متعدّدة البايتات، والترميزات المتعدّدة البايتات تختلف فيما بينها على كيفية تجميع البايتات. أما السلسلة النصية اللاتينية فهي عادةً ASCII صِرف، وكل الترميزات متّفقة على ASCII.
ويفشل الاسترجاع في حالة واحدة بالضبط. حين تصادف أداة فك الترميز بايتات لا معنى لها في ترميزها، فهي لا تُبقيها — بل تضع مكانها U+FFFD وتتخلّص منها. تلك المحارف تضيع نهائياً. وكل ما عداها قابل للعكس.
// The mistake, in three lines of JavaScript
const bytes = new TextEncoder().encode('测试'); // UTF-8: E6 B5 8B E8 AF 95
new TextDecoder('gbk').decode(bytes); // '娴嬭瘯' ← mojibake
new TextDecoder('windows-1252').decode(bytes); // '测试' ← same bytes, other mistake الصق النص المشوّه لتُعدِّد الأداة السلاسل نيابةً عنك. تُجرَّب كل تركيبة من «كُتب بـ» و«قُرئ بـ» عبر UTF-8 وGBK وGB18030 وBig5 وShift_JIS وEUC-KR وWindows-1252 وWindows-1251.
لا يُوسَم المرشّح بـ«مطابق تام» إلا حين تُعيد إعادةُ تمريره عبر السلسلة ذاتها إنتاجَ مدخلك حرفاً بحرف. وهذا فحص حتمي — أما التخمين المرتَّب فلا يخبرك أي النتائج يمكنك الوثوق بها.
يسمّي كل مرشّح الترميز الذي كتب البايتات والترميز الذي أساء قراءتها. وهذا ما تحتاجه لإصلاح المصدر بدل إصلاح السلاسل النصية نفسها من جديد في الأسبوع القادم.
إن كان المدخل يحتوي أصلاً على محارف استبدال، قالت الأداة ذلك صراحةً ووسمت كل مرشّح بأنه جزئي. فالمعلومات التي أُتلفت لحظة فك الترميز لا تعود، والتظاهر بغير ذلك يضيّع وقتك.
انظر إلى أي نص بايتاتٍ ست عشرية عبر كل الترميزات المدعومة جنباً إلى جنب، وفُكّ الست عشري الخام في الاتجاه المعاكس. مفيد لتحديد أطوال الأعمدة وقراءة الالتقاطات الشبكية وفحص محتوى حقول BLOB.
يعتمد فكّ الترميز على TextDecoder الخاص بالمتصفح نفسه. لا رفع ولا تخزين ولا إعادة كتابة للعنوان — وهذا مهم لأن النص المشوّه يأتي مباشرةً من بيئة الإنتاج عادةً.
娴嬭瘯
测试
كان الحرفان الصينيان مخزَّنَين بشكل صحيح بترميز UTF-8 (البايتات E6 B5 8B E8 AF 95)، ثم قرأ برنامجٌ تلك البايتات الستة على أنها GBK. ويجمع GBK البايتات اثنين اثنين، فأنتج ثلاثة محارف بدل اثنين. هذا ما تحصل عليه حين يفتح تطبيق Windows قديم ملفاً بترميز UTF-8، أو حين يُضبط ترميز اتصال قاعدة البيانات على gbk بينما البيانات UTF-8.
测试
测试
البايتات نفسها، وخطأ مختلف. Windows-1252 ترميز أحادي البايت، فصار كل بايت من البايتات الستة محرفاً مستقلاً. واللغات اللاتينية تصطدم بهذه النسخة باستمرار: café تصير café، وnaïve تصير naïve. والعلامة الفارقة هي ظهور à و وâ وعلامات ترقيم شاردة في أزواج.
B2 E2 CA D4
测试
أحياناً لا تنظر إلى نص مشوّه، بل إلى مقطع ست عشري من التقاط شبكي أو من عمود BLOB. الصق الست عشري في القسم الثاني واختر الترميز. فالبايتات B2 E2 CA D4 هي 测试 بترميز GBK — والحرفان نفساهما يشغلان ستة بايتات (اثني عشر رقماً ست عشرياً: E6 B5 8B E8 AF 95) في UTF-8، ولا يمكن تمثيلهما في Windows-1252 بالمرّة.
鏁版嵁搴�
(استرجاع جزئي فقط)
كُتبت 数据库 بترميز UTF-8 وقُرئت على أنها GBK، لكن زوج البايتات الأخير لم يكن له معنى في GBK، فوضعت أداة فك الترميز مكانه المحرف U+FFFD. ذلك البايت ذهب. وتُعلن الأداة عن هذه الحالة بدل أن تخمّن بصمت — لا يزال بإمكانك استرجاع 数据 من مقدمة السلسلة، لكن المحرف الأخير غير قابل للاسترجاع وعليك العودة إلى البيانات المصدر.
ألقِه في الصندوق مباشرة — لا حاجة إلى تحديد الترميز أولاً. ومقتطف قصير يكفي، إذ تحسم اثنا عشر محرفاً السلسلةَ عادةً.
«مطابق تام» تعني أن السلسلة تعود إلى مدخلك حرفاً بحرف. و«جزئي» تعني أنها لا تعود، فعامل النتيجة بوصفها مؤشّراً.
يعرض كل مرشّح الترميز الذي كُتب به النص فعلاً والترميز الذي أساء قراءته. وهذا يخبرك بما ينبغي إصلاحه في المنبع، لا بما كان النص يقوله فحسب.
يعرض القسم الثاني أي نص بايتاتٍ في كل الترميزات الشائعة، ويفكّ الست عشري الخام في الاتجاه المعاكس. استعمله لتحديد أطوال الأعمدة أو لفحص إطارات البروتوكولات.
إن كانت السلسلة النصية تُعرض بشكل صحيح ثم حوّلتها رغم ذلك، فقد صنعت بيدك التشوّه الذي كنت تتجنّبه. تحقّق من العرض أولاً، ولاحظ أن الخط الناقص يظهر مربّعات (□□□) بينما تظهر مشكلة الترميز محارف خاطئة.
iconv -f UTF-8 -t GBK correct.txt > broken.txt
# تأكّد أولاً من الترميز الحالي file -I correct.txt # charset=utf-8 → لا شيء يحتاج تحويلاً
تغيير مجموعة المحارف المعلَنة لعمود في MySQL لا يُعيد ترميز البايتات المخزّنة فيه. وإعلان بيانات latin1 على أنها utf8 يجعل الخادم يعيد بايتات ليست UTF-8 صالحة، فيستبدلها المشغّل بالمحرف U+FFFD — وهو ما يُتلفها.
ALTER TABLE t MODIFY c VARCHAR(255) CHARACTER SET utf8mb4;
-- مُرّ عبر نوع ثنائي كي تُحفظ البايتات بدل إعادة تأويلها ALTER TABLE t MODIFY c VARBINARY(255); ALTER TABLE t MODIFY c VARCHAR(255) CHARACTER SET utf8mb4;
المرشّح الموسوم «جزئي» لم يجتز رحلة الذهاب والعودة. وهو مؤشّر يستحقّ المتابعة، لا جواب تلصقه في قاعدة بياناتك. وإن لم تعد أي نتيجة مطابقة تماماً، فالأرجح أن المدخل فقد معلومات أصلاً — عُد إلى البايتات المصدر.
// خذ المرشّح الأول مهما قالت الشارة db.update(row.id, candidates[0].text);
// لا تكتب إلا ما يجتاز رحلة الذهاب والعودة if (candidates[0].lossless) db.update(row.id, candidates[0].text);
استدعاء encode على شيء هو بايتات أصلاً، أو decode على شيء هو سلسلة نصية أصلاً، يرفع استثناءً في Python 3 بدل أن يدور بصمت دورة عبر ASCII. فُكّ ترميز البايتات مرة واحدة عند الحدّ، وتعامل مع النص بوصفه نصاً بعد ذلك.
text = raw.decode('utf-8').encode('gbk').decode('utf-8') # فُكّ الترميز مرة واحدة عند الحدّ، بالترميز الذي يستعمله الملف فعلاً
with open(path, encoding='gbk') as f:
text = f.read() iconv -f GBK -t UTF-8 input.txt > output.txt على macOS أو Linux، أو Get-Content -Encoding Default in.txt | Set-Content -Encoding UTF8 out.txt في PowerShell. الصق سطراً ممثِّلاً هنا أولاً لتعرف أي ترميزين تسمّيهما في الأمر — فعكس الاتجاه على ملف كامل هو ما يحوّل مشكلة سطر واحد إلى مشكلة ألف سطر. الترميز والتنسيق
جدول ASCII الكامل: 128 حرفًا بالأنظمة العشري والست عشري والثماني والثنائي، مع محوّل ثنائي الاتجاه بين النص وشيفرات ASCII. أحرف التحكم مرفقة بتسلسلات الهروب وتدوين ^ وأين تصادفها فعليًا.
الترميز والتنسيق
رمّز وفك ترميز Base64 مجاناً أونلاين — محوّل فوري مع دعم UTF-8 والرموز التعبيرية. خصوصية 100% — يعمل في متصفّحك. جرّبه الآن.
الترميز والتنسيق
فك ترميز سلسلة Base64 أو عنوان URI للبيانات إلى صورة داخل متصفّحك. عاين واقرأ الأبعاد ونوع MIME ثم نزّل كـ PNG أو JPG أو GIF أو SVG. بلا رفع.
الترميز والتنسيق
حوّل CSV إلى JSON في متصفحك. RFC 4180، استنتاج الأنواع، صف العنوان، أمان الأعداد الكبيرة. خصوصية 100%.
الترميز والتنسيق
الصق ملف .env واحصل على JSON فورًا. كلمات مرور قاعدة بياناتك ومفاتيح API لا تغادر متصفحك أبدًا — خاص 100٪، بلا رفع، محلّل dotenv مجاني.
الترميز والتنسيق
فُكّ كيانات HTML وفُكّ تهريب HTML أونلاين — مجانًا، بلا تسجيل، 100% داخل متصفحك. يحوّل المراجع بالاسم والعشرية والسداسية إلى أحرف؛ لا يُرفع أبدًا.