سؤال

هل هناك أي مكتبة جافا مجانية يمكنني استخدامها لتحويل السلسلة في أحد الترميز إلى ترميز آخر، شيء من هذا القبيل iconv؟أنا أستخدم إصدار جافا 1.3.

هل كانت مفيدة؟

المحلول

وأنت لا تحتاج إلى مكتبة وراء معيار واحد - فقط استخدام <لأ href = "https://docs.oracle.com/javase/6/docs/api/java/nio/charset/Charset.html" يختلط = "نوفولو noreferrer"> محارف . (يمكنك فقط استخدام المنشئات سلسلة وطرق getBytes، ولكن أنا شخصيا لا أحب مجرد العمل مع أسماء المحارف. مجالا كبيرا جدا لالأخطاء المطبعية.)

وتحرير: وكما أشار في تصريحات، لا يزال بإمكانك استخدام مثيلات محارف ولكن لديها سهولة استخدام الأساليب سلسلة: <في أ href = "https://docs.oracle.com/javase/6/docs/api /java/lang/String.html#String٪28byte٪5B٪5D٪2C٪20java.nio.charset.Charset٪29 "يختلط =" نوفولو noreferrer "> سلسلة جديدة (بايت، محارف) و <ل أ href = "https://docs.oracle.com/javase/6/docs/api/java/lang/String.html#getBytes٪28java.nio.charset.Charset٪29" يختلط = "نوفولو noreferrer"> سلسلة. getBytes (محارف) .

وانظر " URL ترميز (أو: ما هي تلك" "رموز %20 في عناوين المواقع؟) ".

نصائح أخرى

CharsetDecoder ينبغي يكون ما كنت تبحث عنه، أليس كذلك؟

والعديد من بروتوكولات الشبكة وملفات تخزين شخصياتهم ذات طابع الموجهة البايت وضع مثل ISO-8859-1 (ISO-Latin-1).
ومع ذلك، ترميز الأحرف الأصلية جاوة هو <ديل> يونيكود UTF16BE (Sixteen- الشيء UCS تنسيق التحول، كبير-endian ترتيب بايت).

Charset . هذا لا يعني UTF16 هو محارف الافتراضي (أي: الافتراضي "تعيين بين متواليات من ستة عشر بت على <وأ href =" http://download-llnw.oracle.com/javase/6/docs/api /java/lang/Character.html#unicode "يختلط =" noreferrer "> وحدات رمز Unicode و سلاسل من وحدات البايت"):

<اقتباس فقرة>   

وكل مثيل من آلة جافا الافتراضية لديه محارف الافتراضية، التي قد تكون أو لا تكون واحدة من ترميز القياسية.
  [US-ASCII، ISO-8859-1 المعروف أيضا باسم ISO-LATIN-1، UTF-8، UTF-16BE، UTF-16LE، UTF-16]
  يتم تحديد محارف الافتراضية أثناء بدء التشغيل الافتراضية آلة وعادة ما يعتمد على لغة ومحارف يتم استخدامها من قبل نظام التشغيل الأساسي.

وهذا المثال يوضح كيفية تحويل ISO-8859-1 بايت المشفرة في ByteBuffer إلى سلسلة في CharBuffer والعكس بالعكس.

// Create the encoder and decoder for ISO-8859-1
Charset charset = Charset.forName("ISO-8859-1");
CharsetDecoder decoder = charset.newDecoder();
CharsetEncoder encoder = charset.newEncoder();

try {
    // Convert a string to ISO-LATIN-1 bytes in a ByteBuffer
    // The new ByteBuffer is ready to be read.
    ByteBuffer bbuf = encoder.encode(CharBuffer.wrap("a string"));

    // Convert ISO-LATIN-1 bytes in a ByteBuffer to a character ByteBuffer and then to a string.
    // The new ByteBuffer is ready to be read.
    CharBuffer cbuf = decoder.decode(bbuf);
    String s = cbuf.toString();
} catch (CharacterCodingException e) {
}

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

وهذا الجواب في السؤال الآخر يعطي تفسيرا لماذا التحويل لا دائما تعطي نتائج صحيحة https://stackoverflow.com/a/2623793/4702806

سيكون الأمر أسهل كثيرًا إذا فكرت في يونيكود كمجموعة أحرف (وهو ما هو عليه بالفعل - فهو في الأساس مجموعة مرقمة من جميع الأحرف المعروفة).يمكنك تشفيره كـ UTF-8 (1-3 بايت لكل حرف اعتمادًا على) أو ربما UTF-16 (2 بايت لكل حرف أو 4 بايت باستخدام أزواج بديلة).

مرة أخرى في ضباب الزمن، استخدمت Java استخدام UCS-2 لتشفير مجموعة أحرف Unicode.يمكن أن يتعامل هذا مع 2 بايت فقط لكل حرف وهو الآن قديم.لقد كان اختراقًا واضحًا إلى حد ما لإضافة أزواج بديلة والانتقال إلى UTF-16.

يعتقد الكثير من الأشخاص أنه كان ينبغي عليهم استخدام UTF-8 في المقام الأول.عندما تمت كتابة Java في الأصل، كان unicode يحتوي على أكثر من 65535 حرفًا على أي حال...

وUTF-8 و UCS-2 / UTF-16 يمكن تمييزها بسهولة معقول عبر علامة ترتيب البايت في بداية الملف. إذا كان هذا موجودا ثم انها رهان جيد جدا أن الملف في هذا الترميز - لكنه ليس من المؤكد ميت. قد جيدا أيضا تجد أن الملف هو في واحدة من تلك ترميزات، ولكن لم يكن لديك علامة ترتيب بايت.

وأنا لا أعرف الكثير عن ISO-8859-2، لكنني لن يفاجأ اذا في كل ملف تقريبا هو ملف نصي صالح في هذا التشفير. أفضل عليك أن تكون قادرة على القيام به هو التحقق من ذلك تجريبيا. في الواقع، فإن صفحة ويكيبيديا الحديث عن هذا الأمر تشير إلى أن 0x7f بايت فقط غير صالح.

وليس هناك فكرة قراءة ملف "كما هو"، وبعد الحصول على نص من - ملف هو سلسلة من بايت، بحيث يكون لديك لتطبيق ترميز الأحرف من أجل فك رموز تلك بايت إلى أحرف

المصدر من ستاكوفيرفلوو

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top