الانتقال إلى المحتوى الرئيسي

كيفية تحديد ترميز ملف في جافا: دليل مفصل

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

تتمثل إحدى طرق تحديد الترميز في تحليل دفق البايت للملف والبحث عن تسلسلات بايت معينة تميز ترميزا معينا. هناك طريقة أخرى وهي استخدام مكتبات الجهات الخارجية التي تقدم حلولا جاهزة لتحديد ترميز الملفات.

تتوفر فئات وطرق مختلفة في جافا للمساعدة في تحديد ترميز الملف. على سبيل المثال ، يمكنك استخدام فئة إنبوتستريمريدر وطريقة جيتينكودينغ () ، الذي يعود الترميز الحالي من دفق البيانات. يمكنك أيضا استخدام فئة تشارسيتديتكتور من مكتبة إيكو 4 ج ، والذي يسمح لك لتحديد الترميز على أساس تحليل النص الإحصائي.

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

  1. التعرف على ترميز الملفات في جافا
  2. الباب 1
  3. 1. تحديد الترميز باستخدام مكتبة وحدة العناية المركزة
  4. 2. تعريف الترميز على أساس بوم (علامة ترتيب البايت)
  5. 3. تحديد الترميز بناء على تردد الحرف

التعرف على ترميز الملفات في جافا

ترميز الملف هو طريقة لتمثيل الأحرف في ملف. يحدد كيفية ترجمة البايت إلى أحرف ، والعكس صحيح. في برمجة جافا ، غالبا ما يكون من الضروري تحديد ترميز الملف المكتوب فيه. في هذه المقالة ، سننظر في طرق مختلفة للحصول على معلومات حول ترميز الملفات في جافا.

1. الحل القياسي:

يقوم بإرجاع الترميز الافتراضي لنظام التشغيل الخاص بك. يمكن أن يكون هذا مفيدا إذا كنت تريد تحديد الترميز لقراءة الملف.

استيراد جافا.نيو.محارف.محارف;

الطبقة العامة الرئيسية {

العامة ثابت الفراغ الرئيسي (سلسلة[] الحجج) {

مجموعة الأحرف الافتراضية = مجموعة الأحرف.ديفولتشارسيت();

النظام.خارج.برينتلن ("مجموعة الأحرف الافتراضية:" + مجموعة الأحرف الافتراضية);

}

}

2. استخدام مكتبة أباتشي تيكا:

.

org.apache.tika

tika-core

1.28

import org.apache.tika.detect.EncodingDetector;

import org.apache.tika.detect.EncodingDetectorBuilder;

import org.apache.tika.io.TikaInputStream;

import org.apache.tika.metadata.Metadata;

import java.io.File;

import java.io.IOException;

import java.nio.charset.Charset;

public class Main {

public static void main(String[] args) throws IOException {

File file = new File("file.txt");

TikaInputStream tikaInputStream = TikaInputStream.get(file);

EncodingDetector encodingDetector = EncodingDetectorBuilder.build();

Charset charset = encodingDetector.detect(tikaInputStream, new Metadata());

System.out.println("Detected charset: " + charset);

tikaInputStream.close();

}

}

3. Использование библиотеки juniversalchardet:

.

com.googlecode.juniversalchardet

juniversalchardet

1.0.3

import com.googlecode.juniversalchardet.UniversalDetector;

import java.io.File;

import java.io.FileInputStream;

import java.io.IOException;

import java.nio.charset.Charset;

public class Main {

public static void main(String[] args) throws IOException {

File file = new File("file.txt");

byte[] data = new byte[(int) file.length()];

FileInputStream input = new FileInputStream(file);

input.read(data);

input.close();

UniversalDetector detector = new UniversalDetector(null);

detector.handleData(data, 0, data.length);

detector.dataEnd();

String encoding = detector.getDetectedCharset();

Charset charset = Charset.forName(encoding);

System.out.println("Detected charset: " + charset);

detector.reset();

}

}

Теперь у вас есть несколько способов определить кодировку файлов в Java. اختيار أنسب واحد لمهمتك والاستمرار في تطوير باستخدام الترميز الصحيح.

الباب 1

يعد تحديد ترميز الملف مهمة مهمة عند العمل مع الملفات النصية في جافا. يسمح لك التعريف الصحيح للترميز بقراءة وكتابة المعلومات النصية بشكل صحيح وتجنب مشاكل عرض البيانات ومعالجتها.

يمكن أن تكون عملية تحديد ترميز ملف في جافا معقدة للغاية بسبب تنوع الترميزات الموجودة وعدم وجود مؤشرات صريحة للترميز في الملفات النصية. ومع ذلك ، هناك بعض الاستراتيجيات التي يمكن أن تساعد في هذه العملية.

1. تحديد الترميز باستخدام مكتبة وحدة العناية المركزة

طريقة واحدة لتحديد ترميز ملف هو استخدام وحدة العناية المركزة (المكونات الدولية ل ونيكود) مكتبة. توفر مكتبة وحدة العناية المركزة مجموعة واسعة من الأدوات للعمل مع الأحرف والسلاسل الدولية ، بما في ذلك وظائف الكشف عن الترميز.

لتحديد ترميز ملف باستخدام مكتبة وحدة العناية المركزة ، اتبع الخطوات التالية:

  1. قم بتوصيل مكتبة وحدة العناية المركزة بمشروع جافا.
  2. افتح الملف كسلسلة من البايتات.
  3. الحصول على كائن من فئة تشارسيتديتكتور من مكتبة وحدة العناية المركزة.
  4. استخدم طريقة ديستكتال () لتحديد ترميزات الملفات المحتملة.
  5. Выбрать наиболее вероятную кодировку с помощью метода detect().

Пример кода для определения кодировки файла с использованием библиотеки ICU:

import com.ibm.icu.text.CharsetDetector;

import com.ibm.icu.text.CharsetMatch;

import java.io.FileInputStream;

public class EncodingDetector {

public static void main(String[] args) {

try {

FileInputStream fis = new FileInputStream("file.txt");

byte[] bytes = new byte[fis.available()];

fis.read(bytes);

كارسيتديتكتور كاشف = جديد كارسيتديتكتور ( ) ;

كاشف.سيتكست (بايت);

تطابق الأحرف [] مباريات = كاشف.ديتكتال();

إذا (مباريات.الطول > 0) {

تشارسيتماتش بيستماتش = مباريات [0];

النظام.خارج.برينتلن ("الترميز المكتشف:" + بيستماتش.جيتنام());

} آخر {

النظام.خارج.برينتلن ("لم يتم اكتشاف الترميز.");

}

} قبض (استثناء ه) {

ه. برينتستاكتريس();

}

}

}

File "ملف.تكست " في شكل سلسلة من وحدات البايت ، وخلق كائن تشارسيتديتكتور ، وتحديد ترميزات الملفات الممكنة باستخدام طريقة ديتكتال () ، واختيار الترميز الأكثر احتمالا باستخدام طريقة كشف() وعرض النتائج إلى وحدة التحكم.

2. تعريف الترميز على أساس بوم (علامة ترتيب البايت)

أ بوم (علامة ترتيب البايت) هو تسلسل خاص من وحدات البايت التي يتم وضعها في بداية ملف نصي للإشارة إلى ترميزه. بعض الترميزات ، مثل أوتف-8 و أوتف-16 ، قد تحتوي على بوم.

واحدة من الطرق لتحديد ترميز ملف في جافا هو التحقق من وجود بوم في بداية الملف. Если BOM присутствует, то кодировка файла может быть определена по его значению.

Пример кода для определения кодировки файла на основе BOM:

import java.io.FileInputStream;

import java.nio.charset.Charset;

public class BOMEncodingDetector {

public static void main(String[] args) {

try {

FileInputStream fis = new FileInputStream("file.txt");

byte[] bom = new byte[3];

fis.read(bom);

if (bom[0] == (byte) 0xEF && bom[1] == (byte) 0xBB && bom[2] == (byte) 0xBF) {

System.out.برينتلن ("الترميز المكتشف: أوتف-8");

} آخر إذا (بوم[0] == (بايت) 0 إكس إف && بوم[1] == (بايت) 0 إكس إف) {

النظام.خارج.برينتلن ("الترميز المكتشف: أوتف-16 (بي)");

} آخر إذا (بوم[0] == (بايت) 0 زف && بوم[1] == (بايت) 0 زف) {

النظام.خارج.برينتلن ("الترميز المكتشف: أوتف-16 (جنيه)");

} آخر {

النظام.خارج.برينتلن ("لم يتم اكتشاف الترميز.");

}

} قبض (استثناء ه) {

ه. برينتستاكتريس();

}

}

}

File "ملف.تكست " والتحقق من قيمها للامتثال لترميزات بوم المعروفة (أوتف-8 ، أوتف-16 بي ، أوتف-16 جنيه). إذا تم العثور على تطابق ، يتم عرض الرسالة المقابلة حول الترميز الذي تم العثور عليه. خلاف ذلك ، يتم عرض رسالة تفيد بأن الترميز غير محدد.

3. تحديد الترميز بناء على تردد الحرف

هناك طريقة أخرى لتحديد ترميز الملف وهي تحليل تكرار حدوث الأحرف في النص. كل ترميز له خصائصه الخاصة في توزيع ترددات الأحرف ، بحيث يمكنك تحديد ترميز الملف من خلال مقارنة تردد الأحرف بالبيانات المعروفة سابقا.

لتحديد الترميز استنادا إلى تردد الحرف ، اتبع الخطوات التالية:

  1. قم بإعداد مجموعة من ترددات الأحرف المعروفة مسبقا للترميزات المختلفة.
  2. افتح الملف كسلسلة من البايتات.
  3. تحويل سلسلة من وحدات البايت إلى سلاسل باستخدام ترميزات مختلفة.
  4. احسب تكرار حدوث الأحرف في كل سطر.
  5. قارن القيم التي تم الحصول عليها مع ترددات الأحرف المعروفة سابقا للترميزات المختلفة.
  6. حدد الترميز الأنسب بناء على مقارنة ترددات الأحرف.

نموذج التعليمات البرمجية لتحديد الترميز على أساس تردد الحرف:

استيراد java.io .فيلنبوتستريم;

استيراد java.io.إنبوتستريمريدر;

استيراد جافا;

استيراد جافا.نيو.محارف.محارف;

استيراد جافا.أوتيل.هاشماب;

استيراد جافا.أوتيل.الخريطة;

تردد الطبقة العامةكودينجديتكتور {

العامة ثابت الفراغ الرئيسي (سلسلة[] الحجج) {

محاولة {

فيلينبوتستريم فيس = جديد فيلينبوستريم ("ملف.النص");

إنبوتستريمريدر إسر = إنبوستريمريدر جديد (فيس);

بوفيريدريدر بر = بوفيريدريدر جديد (إيسر);

ترميزترددات الخريطة = خريطة التجزئة الجديدة ();

ترميزالترددات.وضع (محارف.فورنام ("أوتف-8") ، 0);

ترميزالترددات.وضع (محارف.فورنام ("أوتف-16") ، 0);

ترميزالترددات.وضع (محارف.فورنام ("إسو-8859-1") ، 0);

خط السلسلة;

في حين ((خط = ر.قراءة الخط ())!= لاغية) {

ل (ترميز المحارف: ترميزالترددات.مجموعة المفاتيح ()) {

ترميزالترددات.وضع (ترميز ، ترميزالترددات.الحصول على (ترميز) + عدد الترددات (خط ، ترميز));

}

}

محارف بيستنكودينغ = محارف.فورنام ("أوتف-8");

إنت ماكسفركنسي = ترميزفركنسينس.الحصول على (أفضل الترميز);

ل (ترميز المحارف: ترميزالترددات.مجموعة المفاتيح ()) {

إذا (ترميزالترددات.الحصول على (ترميز) > ماكسفركنسي) {

أفضل ترميز = ترميز;

الترددات القصوى = ترميزالترددات.الحصول على (ترميز);

}

}

النظام.خارج.برينتلن ("الترميز المكتشف:" + أفضل ترميز.اسم العرض());

} قبض (استثناء ه) {

e.برينتستاكتريس();

}

}

خاص ثابت إنت كونتفركنسي (خط سلسلة ، ترميز محارف) {

كثافة العمليات التردد = 0;

بايت [] بايت = خط.جيتبيتس (ترميز);

إلى عن على (بايت ب : بايت) {

إذا (ب = = (بايت) 0 * 20