A karakterlánc konvertálása bájt tömbre és visszafordítás Java-ban
1. Bemutatkozás
Gyakran kell konvertálnunk a következők között Húr és byte tömb Java-ban. Ebben az oktatóanyagban részletesen megvizsgáljuk ezeket a műveleteket.
Először megvizsgáljuk a Húr a byte sor. Ezután megfordítjuk a hasonló műveleteket.
2. Konvertálás Húr nak nek Byte Sor
A Húr Unicode karakter tömbként van tárolva a Java-ban. Átalakítani a byte tömb, a Karakterek sorozatát bájtsorrendbe fordítjuk. Ehhez a fordításhoz példányát használjuk Charset. Ez az osztály hozzárendelést ad meg a chars és ezek sorrendje bytes.
A fenti folyamatra úgy hivatkozunk kódolás.
Kódolhatjuk a Húr ba be byte tömb Java-ban többféle módon. Nézzük meg részletesen mindegyiket példákkal.
2.1. Használata String.getBytes ()
A Húr osztály három túlterheltet biztosít getBytes kódolási módszerek a Húr -ba egy bájt sor:
- getBytes () - kódol a platform alapértelmezett karakterkészletével
- getBytes (String charsetName) - kódol a megnevezett karakterkészlet segítségével
- getBytes (karakterkészlet-karakterkészlet) - kódol a mellékelt karakterkészlet segítségével
Először, kódoljunk egy karakterláncot a platform alapértelmezett karakterkészletével:
String inputString = "Helló világ!"; byte [] byteArrray = inputString.getBytes ();
A fenti módszer platformfüggő, mivel a platform alapértelmezett karakterkészletét használja. Hívással megszerezhetjük ezt a karakterkészletet Charset.defaultCharset ().
Másodszor, kódoljunk egy karakterláncot egy megnevezett karakterkészlet használatával:
@Test public void, amikorGetBytesWithNamedCharset_thenOK () dobja az UnsupportedEncodingException {String inputString = "Hello World!"; String charsetName = "IBM01140"; byte [] byteArrray = inputString.getBytes ("IBM01140"); assertArrayEquals (új bájt [] {-56, -123, -109, -109, -106, 64, -26, -106, -103, -109, -124, 90}, byteArrray); }
Ez a módszer dob UnsupportedEncodingException ha a megnevezett karakterkészlet nem támogatott.
A fenti két verzió viselkedése nincs meghatározva, ha a bemenet olyan karaktereket tartalmaz, amelyeket a karakterkészlet nem támogat. Ezzel szemben a harmadik verzió a karakterkészlet alapértelmezett helyettesítő bájt tömbjét használja a nem támogatott bemenet kódolásához.
Következő, hívjuk a harmadik verzióját a getBytes () metódus és adja át a Karakterkészlet:
@Test public void whenGetBytesWithCharset_thenOK () {String inputString = "Hello ਸੰਸਾਰ!"; Charset charset = Charset.forName ("ASCII"); byte [] byteArrray = inputString.getBytes (karakterkészlet); assertArrayEquals (új bájt [] {72, 101, 108, 108, 111, 32, 63, 63, 63, 63, 63, 33}, byteArrray); }
Itt a gyári módszert alkalmazzuk Charset.forName hogy a Charset. Ez a módszer futásidejű kivételt dob, ha a kért karakterkészlet neve érvénytelen. Futásidejű kivételt is dob, ha a karakterkészlet támogatott a jelenlegi JVM-ben.
Néhány karakterkészlet azonban garantáltan elérhető lesz minden Java platformon. A StandardCharsets osztály meghatározza ezeknek az karaktereknek az állandóit.
Végül, kódoljuk az egyik szabványos karakterkészlet használatával:
@Test public void whenGetBytesWithStandardCharset_thenOK () {String inputString = "Hello World!"; Karakterkészlet = standardCharsets.UTF_16; byte [] byteArrray = inputString.getBytes (karakterkészlet); assertArrayEquals (új bájt [] {-2, -1, 0, 72, 0, 101, 0, 108, 0, 108, 0, 111, 0, 32, 0, 87, 0, 111, 0, 114, 0 , 108, 0, 100, 0, 33}, byteArrray); }
Így befejezzük a különféle áttekintését getBytes változatok. Ezután vizsgáljuk meg a Charset maga.
2.2. Használata Charset.encode ()
A Charset osztály biztosítja kódol(), egy kényelmes módszer, amely az Unicode karaktereket bájtokká kódolja. Ez a módszer mindig az érvénytelen beviteli és a leképezhetetlen karaktereket helyettesíti a karakterkészlet alapértelmezett helyettesítő bájt tömbjével.
Használjuk a kódol módszer a Húr ba be byte sor:
@Test public void whenEncodeWithCharset_thenOK () {String inputString = "Hello ਸੰਸਾਰ!"; Karakterkészlet = standardCharsets.US_ASCII; byte [] byteArrray = charset.encode (inputString) .array (); assertArrayEquals (új bájt [] {72, 101, 108, 108, 111, 32, 63, 63, 63, 63, 63, 33}, byteArrray); }
Mint fent láthatjuk, a nem támogatott karaktereket lecserélték a karakterkészlet alapértelmezett helyettesítésére byte 63.
Az eddig alkalmazott megközelítések a CharsetEncoder osztályon belül a kódolás elvégzéséhez. Vizsgáljuk meg ezt az osztályt a következő szakaszban.
2.3. CharsetEncoder
CharsetEncoder átalakítja az Unicode karaktereket egy adott karakterkészlet bájtsorozatává. Ezenkívül finom részletgazdagságot biztosít a kódolási folyamat felett.
Használjuk ezt az osztályt a Húr ba be byte sor:
@Test public void, amikor aUsingCharsetEncoder_thenOK () dobja a CharacterCodingException {String inputString = "Hello ਸੰਸਾਰ!"; CharsetEncoder encoder = StandardCharsets.US_ASCII.newEncoder (); encoder.onMalformedInput (CodingErrorAction.IGNORE) .onUnmappableCharacter (CodingErrorAction.REPLACE) .replaceWith (új byte [] {0}); byte [] byteArrray = kódoló.encode (CharBuffer.wrap (inputString)) .array (); assertArrayEquals (új byte [] {72, 101, 108, 108, 111, 32, 0, 0, 0, 0, 0, 33}, byteArrray); }
Itt létrehozunk egy példányt CharsetEncoder felhívásával a newEncoder módszer a Charset tárgy.
Ezután megadjuk a hibaállapotokra vonatkozó műveleteket a onMalformedInput () és onUnmappableCharacter () mód. A következő műveleteket adhatjuk meg:
- IGNORE - dobja el a hibás bevitelt
- KICSERÉLÉS - cserélje ki a hibás bemenetet
- JELENTÉS - jelentse a hibát a CoderResult tárgy vagy dobás a CharacterCodingException
Továbbá a Cseréld ki() módszer a csere megadására byte tömb.
Így befejezzük a különféle megközelítések áttekintését, hogy egy Stringet bájttömbbé alakítsunk. Most nézzük meg a fordított műveletet.
3. Bájtömb átalakítása karakterláncra
Utalunk a konvertálás folyamatára byte tömb a Húr mint dekódolás. A kódoláshoz hasonlóan ehhez a folyamathoz a Charset.
Azonban nem használhatunk egyetlen karakterkészletet sem a bájt tömb dekódolásához. Azt a karakterkészletet kell használnunk, amelyet a Húr ba,-be byte sor.
Sokféleképpen konvertálhatunk egy bájt tömböt String-be. Vizsgáljuk meg mindegyiket részletesen.
3.1. Használni a Húr Konstruktőr
A Húr osztályban kevés a kivitelező, amelyek a byte tömb bemenetként. Mind hasonlítanak a getBytes módszerrel, de fordítva működik.
Első, konvertáljunk egy bájt tömböt Húr a platform alapértelmezett karakterkészletének használata:
@Test public void whenStringConstructorWithDefaultCharset_thenOK () {byte [] byteArrray = {72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33}; String string = új karakterlánc (byteArrray); assertNotNull (karakterlánc); }
Vegye figyelembe, hogy itt nem állítunk semmit a dekódolt karakterlánc tartalmáról. Ennek oka lehet, hogy valami másra dekódolja, a platform alapértelmezett karakterkészletétől függően.
Ezért általában kerülnünk kell ezt a módszert.
Másodszor, használjunk egy megnevezett karakterkészletet a dekódoláshoz:
@Test public void, amikor aStringConstructorWithNamedCharset_thenOK () dobja az UnsupportedEncodingException {String charsetName = "IBM01140" parancsot; bájt [] byteArrray = {-56, -123, -109, -109, -106, 64, -26, -106, -103, -109, -124, 90}; String string = új karakterlánc (byteArrray, charsetName); assertEquals ("Hello World!", karakterlánc); }
Ez a módszer kivételt hoz, ha a megnevezett karakterkészlet nem érhető el a JVM-en.
Harmadszor, használjuk a Charset objektum a dekódoláshoz:
@Test public void whenStringConstructorWithCharSet_thenOK () {Charset charset = Charset.forName ("UTF-8"); byte [] byteArrray = {72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33}; String string = új karakterlánc (byteArrray, karakterkészlet); assertEquals ("Helló világ!", karakterlánc); }
Végül, használjunk szabványt Charset ugyanazért:
@Test public void whenStringConstructorWithStandardCharSet_thenOK () {Charset charset = StandardCharsets.UTF_16; byte [] byteArrray = {-2, -1, 0, 72, 0, 101, 0, 108, 0, 108, 0, 111, 0, 32, 0, 87, 0, 111, 0, 114, 0, 108, 0, 100, 0, 33}; String string = új karakterlánc (byteArrray, karakterkészlet); assertEquals ("Helló világ!", karakterlánc); }
Eddig a byte tömb a Húr a konstruktor segítségével. Vizsgáljuk meg most a többi megközelítést.
3.2. Használata Charset.decode ()
A Charset osztály biztosítja a dekódolni () módszer, amely átalakítja a ByteBuffer nak nek Húr:
@Test public void whenDecodeWithCharset_thenOK () {byte [] byteArrray = {72, 101, 108, 108, 111, 32, -10, 111, 114, 108, -63, 33}; Karakterkészlet = standardCharsets.US_ASCII; Karaktersorozat = charset.decode (ByteBuffer.wrap (byteArrray)) .toString (); assertEquals ("Hello orl !", karakterlánc); }
Itt, az érvénytelen bemenetet helyettesíti a karakterkészlet alapértelmezett helyettesítő karakterével.
3.3. CharsetDecoder
A dekódolás belső megközelítésének összes korábbi megközelítése használja a CharsetDecoder osztály. Ezt az osztályt közvetlenül használhatjuk a dekódolási folyamat finomszemcsés ellenőrzésére:
@Test public void whenUsingCharsetDecoder_thenOK () dobja a CharacterCodingException {byte [] byteArrray = {72, 101, 108, 108, 111, 32, -10, 111, 114, 108, -63, 33}; CharsetDecoder dekóder = StandardCharsets.US_ASCII.newDecoder (); decoder.onMalformedInput (CodingErrorAction.REPLACE) .onUnmappableCharacter (CodingErrorAction.REPLACE) .replaceWith ("?"); Karaktersorozat = decoder.decode (ByteBuffer.wrap (byteArrray)) .toString (); assertEquals ("Hello? orl ?!", karakterlánc); }
Itt az érvénytelen bemeneteket és a nem támogatott karaktereket „?” -Re cseréljük.
Ha tájékoztatni akarunk érvénytelen inputokról, akkor megváltoztathatjuk a dekóder mint:
decoder.onMalformedInput (CodingErrorAction.REPORT) .onUnmappableCharacter (CodingErrorAction.REPORT)
4. Következtetés
Ebben a cikkben többféle konverziót vizsgáltunk Húr bájt tömbre, és fordítsa meg. Meg kell választanunk a megfelelő módszert a bemeneti adatok, valamint az érvénytelen bemenetekhez szükséges ellenőrzési szint alapján.
Szokás szerint a teljes forráskód megtalálható a GitHubon.