مشكلة رمز القمامة في جافا
في الآونة الأخيرة ، عند القيام بالمشاريع ، غالبًا ما أواجه مشاكل رمز مشوهة في Java ، لذلك أخذت الوقت الكافي لفرز مشاكل الكود المشوهة وكيفية التعامل معها. هنا قمت بتجميعها.
تحليل
ترميز وفك تشفير
الترميز هو تحويل الأحرف إلى بايت ، وفك التشفير هو تحويل البايت إلى أحرف.
دفق البايت ودفق الأحرف
يتم تنفيذ جميع ملفات القراءة والكتابة من خلال تدفقات البايت. حتى لو كان هناك دفق حرف في جافا ، فإن الطبقة الأساسية لا تزال تستخدم دفق البايت.
تحدث مشكلة رمز القمامة
الشخصيات الأكثر استخدامًا في Java هي الشخصيات. عندما نقرأ الملف في الذاكرة وعرضه في وحدة التحكم (دفق البايت ---> دفق الأحرف) ، نحتاج إلى استخدام فك التشفير. إذا كان الملف UTF-8 ترميز وقمنا بإساءة استخدامه على GBK عند فك التشفير (إذا لم يتم تحديد الترميز ، فسيقوم Java بتبني الترميز الافتراضي للنظام) لفك تشفيره ، ثم يمكن عرض التعليمات البرمجية المشوهة فقط. عندما نكتب الملفات ، من الأفضل تحديد الترميز (UTF-8).
حل
مثال 1
عند تحويل دفق بايت إلى دفق حرف ، نحدد تنسيق الترميز. يجب تشفير هذا ملفنا أيضًا بواسطة GB2312
read static string static read (string filename) يلقي الاستثناء {inputStream = جديد fileInputStream (اسم الملف) ؛ BufferedReader في = جديد BufferedReader (New InputStreamReader (IS ، "GB2312")) ؛ // حدد سلسلة تنسيق الترميز s ؛ StringBuilder sb = new StringBuilder () ؛ بينما ((s = in.readline ())! = null) {sb.append (s + "/n") ؛ } in.close () ؛ إرجاع sb.tostring () ؛} مثال 2
اقرأ مباشرة من خلال دفق البايت ، وحدد الترميز عند تحويله إلى أحرف باستخدام String.
package com.dy.xidian ؛ import java.io.fileInputStream ؛ import java.io.inputStream ؛ class bufferedInputFile {public static read (string filename) rems {suppressWarnings ("Resource") inputStream is = جديد fileInputStream (filename) ؛ بايت [] ب = بايت جديد [1024] ؛ is.Read (b) ؛ إرجاع سلسلة جديدة (B ، "GB2312") ؛ }} الفئة العامة MemoryInput {public static void main (string [] args) يلقي استثناء {String fileName = "e: /html/gb2312.php" ؛ سلسلة s = bufferedInputFile.Read (اسم الملف) ؛ system.out.println (s) ؛ }}فخ
هناك فئة FileReader في عمليات الإدخال/الإخراج. يخفي هذا الفئة تفاصيل تدفق البايت في تدفقات الأحرف ، والتي يمكننا استخدامها بهذه الطريقة. BufferedReader في = جديد BufferedReader (New FileReader (filename)) ؛ وبهذه الطريقة ، نحصل مباشرة على دفق الأحرف. لكننا وجدنا أننا لم نضع الترميز ، لأن طريقة الترميز الافتراضية تم اعتمادها في FileReader. هذا يصبح خطير جدا. إذا كان تنسيق الترميز الافتراضي الخاص به يختلف عن ترميز ملفنا ، فيجب تشويه بيانات القراءة. لذلك من الأفضل أن نستخدم الطريقة في المثال لتحويل الدفق.
شكرا لك على القراءة ، آمل أن تساعدك. شكرا لك على دعمك لهذا الموقع!