كيف يمكنني تنفيذ عملية تكرار مستقلة عن الترميز في جافا؟
-
27-09-2019 - |
سؤال
أواجه مشكلة غريبة في مقارنة السلاسل. أرسل سلسلة إلى الخادم الخاص بي (مع استخدام البايتات 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
لمقارنة السلاسل.