Кодирование строки в UTF-8 и 7-битное кодирование - PullRequest
0 голосов
/ 20 сентября 2019

Я хочу закодировать строку, используя как 7-битный, так и Unicode (UTF-8).

import java.nio.ByteBuffer;  
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;

public class Example{
    public static void main(String[] args) throws Exception{
        String originalMessage = "*ABC";
        sevenBitEncoding(originalMessage);
        unicodeEncoding(originalMessage);
    }

    private static void sevenBitEncoding(String originalMessage) {
        char[] ch=originalMessage.toCharArray();
        byte[] bytes = new String(ch).getBytes();
        StringBuilder encodedMessage = new StringBuilder();
        encodedMessage.append("[");
        for(int i=0; i < bytes.length; i++) {
            encodedMessage.append(bytes[i] + ",");
        }
        encodedMessage.replace(encodedMessage.length()-1, encodedMessage.length(), "]");
        System.out.println("7-bit  :" + encodedMessage.toString());
    }

    private static void unicodeEncoding(String originalMessage) {
        byte[] bytes = originalMessage.getBytes(StandardCharsets.UTF_8);
        // ByteBuffer byteBuffer = StandardCharsets.UTF_8.encode(originalMessage);
        StringBuilder encodedMessage = new StringBuilder();
        encodedMessage.append("[");
        for(int i=0; i < bytes.length; i++) {
            encodedMessage.append(bytes[i] + ",");
        }
        encodedMessage.replace(encodedMessage.length()-1, encodedMessage.length(), "]");
        System.out.println("unicode:" + encodedMessage.toString());
    }
}

Вывод:

7-bit  :[65,66,67]
unicode:[65,66,67]

Ожидаемый вывод:

Поскольку UTF-8 использует основание 16, ожидаемое значение для UTF-8 составляет 2А.https://flaviocopes.com/unicode/

7-bit  :[42,65,66,67]
unicode:[2A,41,42,43]

Есть ли способ достичь этого?

1 Ответ

1 голос
/ 20 сентября 2019

Вы делаете много ненужных вещей, например, создаете новые строки из char[] предыдущего без всякой причины и вызываете getBytes() без параметра Charset, который является нет-нет.Вы также путаете основы и почему-то думаете, что «юникод использует шестнадцатеричное», что просто не имеет смысла.

Вот как показать байты строки с заданной кодировкой (например, UTF-8).

// Values are decimal, not hex
System.out.println(Arrays.toString("*ABC".getBytes(StandardCharsets.UTF8)));

Байты для *ABC одинаковы во всех распространенных кодировках, поэтому, если вы хотите увидеть различия, вам понадобится найти очень экзотическую кодировку или использовать символы, кодированные по-разному(например, акцентированные символы, такие как é, à, ä, ö, å, которые занимают 2 байта в UTF-8).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...