תהליך המרת מערך בתים למחרוזת נקרא פענוח. תהליך זה מצריך ערכת תווים. עם זאת, עלינו להשתמש בתווים עבור פִּעַנוּחַ מערך בתים.
ישנן שתי דרכים להמיר מערך בתים למחרוזת:
- על ידי שימוש ב בנאי מחלקות מחרוזות
- על ידי שימוש ב קידוד UTF-8
על ידי שימוש ב-String Class Constructor
הדרך הפשוטה ביותר להמיר מערך בתים למחרוזת, נוכל להשתמש ב-String class constructor עם byte[] כארגומנט הבנאי.
String str=new String(bytes);
דוגמא
הדוגמה הבאה אינה משתמשת בקידוד תווים כלשהו.
java אופס מושגים
public class ByteArraytoStringExample { public static void main(String args[]) { try { byte[] bytes = 'hello world'.getBytes(); //creates a string from the byte array without specifying character encoding String s = new String(bytes); System.out.println(s); } catch(Exception e) { e.printStackTrace(); } } }
תְפוּקָה:
כפול ב-java
באמצעות קידוד UTF-8
זכור את קידוד התווים בעת המרת מערך הבתים למחרוזת. מכיוון שבתים הם הנתונים הבינאריים בעוד מחרוזת היא נתוני תו. חשוב לדעת את הקידוד המקורי של הטקסט שממנו נוצר מערך הבתים. כאשר אנו משתמשים בקידוד תווים אחר, איננו מקבלים בחזרה את המחרוזת המקורית.
נניח שעלינו לקרוא מערך בתים מקובץ שמקודד ב' ISO_8859_1 '. אין לנו שום קידוד תווים בזמן המרת מערך בתים למחרוזת. אנו ממירים מערך בתים למחרוזת על ידי שימוש ב-String class constructor, אך הוא אינו מספק ערובה לכך שנקבל את אותו הטקסט בחזרה. הסיבה לכך היא שהקונסטרוקטור של מחלקת String משתמש בקידוד ברירת המחדל של הפלטפורמה.
בתים מכיל 8 סיביות שיכולים להיות עד 256 ערכים נפרדים. זה עובד עבור ערכת תווים ASCII, שבה נעשה שימוש בשבע סיביות בלבד. אם למערכות התווים יש יותר מ-256 ערכים, עלינו לציין במפורש את הקידוד שאומר כיצד לקודד תווים לרצף של בתים.
ישנן ערכות תווים הבאות הנתמכות על ידי פלטפורמת Java הן:
- StandardCharsets.ISO_8859_1
- StandardCharsets.US_ASCII
- StandardCharsets.UTF_16
- StandardCharsets.UTF_16BE
- StandardCharsets.UTF_16LE
כאשר איננו זוכרים קידוד מדויק, במקרים כאלה הפלטפורמה שלנו אינה מסוגלת להמיר את התווים המיוחדים הללו כראוי. בעיה זו נפתרת על ידי מתן ' UTF-8 ' כקידוד תו. Java מספקת בנאי נוסף בעומס יתר במחלקה String המקבל קידוד תווים.
new String(byte[], 'character encoding');
דוגמא
בדוגמה הבאה, השתמשנו StandardCharset.UTF_8 כדי לציין את הקידוד.
דפי שרת java
import java.io.IOException; import java.nio.charset.StandardCharsets; public class ByteArraytoStringExample1 { public static void main(String[] args) { try { byte[] b = 'Morning'.getBytes(StandardCharsets.UTF_8); //byte array String string = new String(b, StandardCharsets.UTF_8); //string with 'UTF-8' encoding System.out.println(string); } catch(Exception e) { e.printStackTrace(); } } }
תְפוּקָה:
דוגמא
בדוגמה הבאה, לקחנו char בעת יצירת מערך הבתים. זה עובד בגלל אוטובוקסינג. התו 'T' עובר המרה ל-84 במערך הבתים וכן הלאה. זו הסיבה שהפלט של שני מערך הבתים זהה.
public class ByteArraytoStringExample2 { public static void main(String[] args) { byte[] byteArray = { 'T', 'E', 'C', 'H', 'N', 'O','L','O','G','Y'}; //byte array of characters byte[] byteArray1 = { 84, 69, 67, 72, 78, 79, 76, 79, 71, 89}; //array of ASCII values String s = new String(byteArray); //converts byteArray to String String str = new String(byteArray1); System.out.println(s); System.out.println(str); } }
תְפוּקָה:
מערכת קבצים בלינוקס
למחלקה String יש גם בנאי שבו נוכל להעביר מערך בתים ו-Charset כארגומנט. כך שהמשפט הבא יכול לשמש גם כדי להמיר מערך בתים למחרוזת ב-Java.
String str = new String(byteArray, StandardCharsets.UTF_8)
למחלקה String יש גם בנאי להמרת תת-קבוצה של מערך הבתים ל-String.
String(byte[] bytes, int offset, int length, String charsetName)
בואו נראה דוגמה נוספת שבה נעשה שימוש בקידוד שונה.
דוגמא
import java.io.UnsupportedEncodingException; public class ByteArraytoStringExample3 { public static void main(String args[]) { try { byte[] bytes = new byte[] { 75, 69, 82, 115, 121, 90, 43, 98, -30}; //bytes in ASCII code String utf = new String(bytes, 'UTF-8'); //converts into UTF-8 encoding String cp1252 = new String(bytes, 'Cp1252'); //conversts into Cp1252 endcoding //converts into windows-1252 encoding String windows1252 = new String(bytes, 'Windows-1252'); System.out.println('String in UTF-8 encoding : ' + utf); System.out.println('String in Cp1252 encoding : ' + cp1252); System.out.println('string Windows-1252 encoding : ' + windows1252); } catch(Exception e) { e.printStackTrace(); } } }
תְפוּקָה: