Java несколько циклов

Подскажите как вывести напротив каждой буквы s её значение z? Сейчас для каждого символа s выводится весь пул z.

    String s = "Hello!";
    byte[] z = s.getBytes(StandardCharsets.UTF_8);

    char[] ch = new char[s.length()];
    for (int i = 0; i < s.length(); i++) {
        ch[i] = s.charAt(i);
        for (byte b : z) {
        System.out.println(ch[i] + " Значение символа: " + b );
        }
    }

Ответы (2 шт):

Автор решения: Дмитрий

А зачем столько циклов? Так должно работать:

String s = "Hello!";
byte[] z = s.getBytes(StandardCharsets.UTF_8);
for (int i = 0; i < s.length(); i++) {
    System.out.println(s.charAt(i) + " Значение символа: " + z[i]);
}
→ Ссылка
Автор решения: Stanislav Volodarskiy

Ваша ошибка состоит в том что для каждого символа вы выводите не только его байты но и байты всей строки.

В Java символ может задаваться несколькими байтами. Нужно переводить строку в байты посимвольно и для каждого символа выводить все байты. И это ещё без упоминания суррогатных пар:

import java.nio.charset.StandardCharsets;

public class CharBytes {
    public static void main(String ... args) {
        for (String arg : args) {
            System.out.println();
            System.out.println(arg);
            for (int i = 0; i < arg.length(); ++i) {
                char c = arg.charAt(i);
                byte[] bytes = String.valueOf(c).getBytes(
                    StandardCharsets.UTF_8
                );
                System.out.print("'" + c + "':");
                for (byte b : bytes) {
                    System.out.print(" " + b);
                }
                System.out.println();
            }
        }
    }
}
$ javac CharBytes.java && java CharBytes Hello! Привет!

Hello!
'H': 72
'e': 101
'l': 108
'l': 108
'o': 111
'!': 33

Привет!
'П': -48 -97
'р': -47 -128
'и': -48 -72
'в': -48 -78
'е': -48 -75
'т': -47 -126
'!': 33
→ Ссылка