سؤال

هل هناك طريقة لتحويل سلسلة ANSI إلى UTF باستخدام Java.

لدي تسلسل مخصص يستخدم أساليب Readutf & TruTutf من فئة DataPutstream إلى سلسلة Deserialize and Serialze. إذا كنت أتلقى سلسلة مشفرة في ANSI وهي طويلة جدا، ~ 100000 حرف طويل أحصل على الخطأ؛

الناجمة عن: java.io.utfdataformatexception: سلسلة مشفرة طويلة جدا: 106958 بايت

ولكن في اختبارات جونيت الخاصة بي أنا قادر على إنشاء سلسلة مع 120000 'A' A يعمل بشكل مثالي

لقد راجعت المشاركات التالية ولكنها لا تزال لها أخطاء؛

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

المحلول

لا يحدث هذا الخطأ عن ترميز الأحرف. وهذا يعني أن طول بيانات UTF مخطئ.

تحرير: أدركت فقط أن هذا خطأ في الكتابة، وليس قراءة الخطأ.

طول UTF طول 2 بايت فقط حتى تتمكن من الاحتفاظ فقط 64 كيلو بايت UTF-8 بايت. أنت تحاول كتابة 100K، لن تعمل.

هذا الحد هو فائق وأي حال من الأحوال للتجول في هذا،

if (utflen > 65535)
    throw new UTFDataFormatException(
            "encoded string too long: " + utflen + " bytes");

نصائح أخرى

byte[] asciiBytes = ...;
String unicode = new String(asciiBytes, "US-ASCII");
byte[] utfBytes = unicode.getBytes("UTF-8");

أي ansi codepage.ب هناك الكثير من ترميزات الأحرف المختلفة التي تشير إليها جميعها إلى "ansi". DOS Codepage هو 437 (بدون رموز الرسم). إذا كنت تستخدم Codepage 850، فسوف يعمل هذا:

String unicode = new String(bytes, "IBM850");

(أين bytes هي صفيف مع أحرف ANSI). بعد ذلك، يمكنك تحويل هذه السلسلة إلى صفيف بايت مع أي ترميز باستخدام unicode.getBytes(encoding).

غالبا ما يستخدم Windows Codepage 1252 (استخدم "Windows-1252" لذلك).

أجاب ZZ Coder بالفعل على السؤال، لكنني كتبت شرحا أكثر تفصيلا واقتراح على الحل هذه بلوق. وبعد في الأساس، المشكلة موجودة في dataoutputstream، لأنه يقيد السلسلة المكتملة إلى 64 كيلو بايت. هناك حلول محتملة أخرى لإصدار المشكلة، قد يعمل البعض دون كسر تنسيق البيانات الثنائية الفعلية يستخدم One ...

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