كيف يمكنني تنفيذ عملية تكرار مستقلة عن الترميز في جافا؟

StackOverflow https://stackoverflow.com/questions/3841496

سؤال

أواجه مشكلة غريبة في مقارنة السلاسل. أرسل سلسلة إلى الخادم الخاص بي (مع استخدام البايتات getBytes()) من العميل. لقد تأكد من أن الترميز هو نفسه على العميل والخادم من خلال بدء كلاهما -Dfile.encoding=UTF-8.

لقد لاحظت المشكلة عندما كنت أحاول أداء valueOf على السلسلة التي أتلقاها من العميل ، لتحويلها إلى تعداد. عندما أقوم بطباعة الأوتار ، ينظرون بالضبط نفس الشيء. لكن عندما أقوم بأداء أ compareTo, ، أحصل على رقم غير صفري و equals عائدات false.

أفترض أنها مشكلة تشفير. لست متأكدًا حقًا-ما زلت مبتدئًا عندما يتعلق الأمر ببرمجة خادم العميل مع Sockets.

هذا ما أحصل عليه:

Waiting for connections on port 9090
Connected to client: 127.0.0.1
received command: GetAllItems
The value is |GetAllItems| (from client)
The value is |GetAllItems| (from enum)
equals: false

ما الخطأ الذي افعله؟

تحديث

إليكم كيف أقوم بإعادة تشكيل السلسلة من الدفق. ربما هذا هو المكان الذي أفعل فيه شيئًا خاطئًا؟

byte[] commandBytes = new byte[1024];
in.read(commandBytes); //in is a BufferedInputReader
String command = new String(commandBytes);
هل كانت مفيدة؟

المحلول

أظن أنه نظرًا لأن المخزن المؤقت الخاص بك أكبر من سلسلتك ، فهناك خام إضافي في السلسلة التي أعيد النظر فيها. من القانوني أن يتم تضمين الأشرطة داخل الأوتار في Java (على عكس C والشركة) ، على الرغم من أن Java تتعامل معها بشكل مختلف عن UTF-8 القياسي.

حاول تسجيل قراءة الطول ، وقم بتمرير هذا الطول إلى مُنشئ السلسلة:

int bytesRead = in.read(commandBytes);
String command = new String(commandBytes, 0, bytesRead);

نصائح أخرى

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

byte[] commandBytes = new byte[1024];
int length = in.read(commandBytes); //in is a BufferedInputReader
String command = new String(commandBytes, 0, length);

يستخدم java.text.Collator لمقارنة السلاسل.

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