في جافا، عندما نتعامل مع خيط في بعض الأحيان يكون مطلوبًا ترميز سلسلة في مجموعة أحرف محددة. التشفير هي طريقة لتحويل البيانات من تنسيق إلى آخر. تستخدم كائنات السلسلة ترميز UTF-16. مشكلة UTF-16 هي أنه لا يمكن تعديله. هناك طريقة واحدة فقط يمكن استخدامها للحصول على ترميز مختلف، مثل مصفوفة البايت [] . طريقة التشفير غير مناسبة إذا حصلنا على بيانات غير متوقعة. في هذا القسم سوف نتعلم كيفية ترميز سلسلة في جافا .
ملاحظة: ليس من الممكن ترميز سلسلة في UTF-8. لذلك، استخدم إما ByteBuffer أو قم باستدعاء مصفوفة عليه للحصول على بايت[].
قبل المضي قدمًا في هذا القسم، علينا أن نفهم ترميز الأحرف. دعونا نلقي نظرة سريعة. دعونا نفهم لماذا نحتاج إلى تشفير سلسلة .
ترميز الأحرف هي تقنية لتحويل البيانات النصية إلى أرقام ثنائية. يمكننا تعيين قيم رقمية فريدة لأحرف محددة وتحويل هذه الأرقام إلى لغة ثنائية. يمكن تحويل هذه الأرقام الثنائية لاحقًا إلى أحرف أصلية بناءً على قيمها.
مشكلة
لنفترض أن لدينا سلسلة ألمانية الوداع والمطلوب ترميزه. خذ بعين الاعتبار مقتطف التعليمات البرمجية التالي:
String str = 'Tsch�ss'; byte[] bytesOfString = str.getBytes(); String encoded_String = new String(bytesOfString, StandardCharsets.US_ASCII); assertNotEquals(encoded_String, str);
إذا قمنا بتشفير السلسلة باستخدام US_ASCII، فإنه يعطي الوداع لأن ترميز US_ASCII لا يفهم الحرف غير ASCII ( ش ). عندما نقوم بتحويل سلسلة مشفرة ASCII إلى UTF-8، نحصل على نفس السلسلة.
String str = 'GoodBye'; byte[] bytesOfString = str.getBytes(); String asciiEncondedEnglishString = new String(bytesOfString, StandardCharsets.US_ASCII); assertEquals(encoded_String, str);
إذا كانت مصفوفة بايت[] تحتوي على نص غير Unicode، فيمكننا تحويل النص إلى Unicode باستخدام خيط البناء. على العكس من ذلك، يمكننا أيضًا تحويل كائن سلسلة إلى مصفوفة بايت[] من أحرف غير Unicode باستخدام سلسلة.getBytes() طريقة. دعونا نقوم بتشفير السلسلة باستخدام الحصول على بايت () طريقة.
باستخدام طريقة String.getBytes()
جافا خيط فصل يوفر طريقة getBytes() الذي يتم استخدامه لترميز سلسلة s إلى UTF-8. تقوم الطريقة بتحويل السلسلة إلى سلسلة من البايتات وتخزين النتيجة في مصفوفة.
بناء الجملة:
public byte[] getBytes(String charsetName) throws UnsupportedEncodingException
يقوم بتوزيع charsetName كمعلمة وإرجاع صفيف البايت. فإنه يلقي UnsupportedEncodingException إذا كانت مجموعة الأحرف المسماة غير مدعومة.
لنقم بإنشاء برنامج Java يقوم بتحويل السلسلة إلى ترميز UTF-8.
StringEncodingExample.java
public class StringEncodingExample { public static void main(String args[]) throws Exception { //string to encode String str = 'Google Cloud'; //invokes the getBytes() method and stores an array of bytes into array[] byte array[] = str.getBytes('UTF8'); System.out.println('Encoded String: '); //enhanced for loop that iterates over the array for (byte x: array) { //prints the sequence of bytes System.out.print(x+' '); } } }
انتاج:
Encoded String: 71 111 111 103 108 101 32 67 108 111 117 100
باستخدام فئة StandardCharsets
يمكننا أيضًا استخدام فئة StandardCharset لترميز السلسلة. هناك خطوتان لترميز السلسلة. أولاً، قم بفك تشفير السلسلة إلى بايت ثم قم بتشفيرها إلى UTF-8. على سبيل المثال، خذ بعين الاعتبار الكود التالي:
String str = ' Tsch�ss'; ByteBuffer buffer = StandardCharsets.UTF_8.encode(str); String encoded_String = StandardCharsets.UTF_8.decode(buffer).toString(); assertEquals(str, encoded_String);
هناك طريقة أخرى لتشفير سلسلة وهي استخدام ترميز Base64. سنناقش تشفير وفك تشفير Base64 في القسم التالي.