Я использую этот код в C# .net для отправки запроса на веб-страницу.
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
Byte[] rnd = new Byte[64];
rng.GetBytes(rnd);
hidChallenge.Value = Encoding.Unicode.GetString(rnd);
И я его в java скрипте использую.
var base64str = document.getElementById("<%=hidChallenge.ClientID %>");
При запуске и отладке:
base64str = 感≗좦短䗅燛梻脕冔춇噙풣訋詇蹘᧩쾏휇늸䫐顨◣希ࠟ䠎ᐷ
Но в java (JSP)
Я использую этот код:
Random r = new Random();
byte[] rndbyte = new byte[64];
r.nextBytes(rndbyte);
String challenge = new String(rndbyte,StandardCharsets.UTF_16LE);
session.setAttribute("challenge", challenge);
И в javascript:
var base64str = 퓻 �ꦖ 쁳 春 꼪 ꝝ 䣇 ͋ꟼ 䆺 㺪 ᠁ 郷 ̣ 攺 줶 歮 ㏹ 㬎 ꢔ 崬 魔 弝 翊
Я также стараюсь следовать кодировке:
US_ASCII
UTF_8
UTF_16
Итак, я получаю ошибку строки base 64.
Честно говоря, просто используйте base64.




похоже, что существует путаница между тем, для чего предназначены UTF-8/16 или Ascii, и Base64.
UTF-8 предназначен для кодирования строки в байтовую последовательность. И Base64 предназначен для кодирования последовательности байтов в строку.
Если вы хотите сгенерировать base64 на Java, вот как это должно выглядеть:
Random r = new Random();
byte[] rndbyte = new byte[64];
r.nextBytes(rndbyte);
String challenge = Base64.encodeBase64String(rndbyte);
session.setAttribute("challenge", challenge);
Вот еще один пост, который довольно хорошо объясняет разницу, если вы хотите узнать об этом больше: В чем разница между UTF8 / UTF16 и Base64 с точки зрения кодировки
Какого черта? Это не base64. Это ... Хорошо, я это видел. Прервется, если два байта находятся внутри суррогатного диапазона.