import java.util.*;
import java.lang.*;
import java.text.Normalizer;
import java.nio.charset.*;
import java.io.*;
class Ideone
{
{
System.
out.
println(convertToIso88591WithCodepointNames
("Hello \uD83D\uDE00 \uD835\uDC2E frappé, naïve, soufflé")); }
public static String convertToIso88591WithCodepointNames
(String input
) { // Normalize to replace as much as possible with normal character forms
input = Normalizer.normalize(input, Normalizer.Form.NFKC);
// Then substitute as required into the target charset
CharsetEncoder encoder = StandardCharsets.ISO_8859_1.newEncoder();
StringBuilder resultBuilder = new StringBuilder();
// Iterate through the string by codepoint
for (int i = 0; i < input.length(); ) {
int codePoint = input.codePointAt(i);
if (encoder.canEncode(utf16chars)) {
resultBuilder.append(utf16chars);
} else {
// Character is NOT encodable, replace with its Unicode codepoint name
resultBuilder.append('[');
resultBuilder.
append(Character.
getName(codePoint
)); resultBuilder.append(']');
}
i += utf16chars.length();
}
return resultBuilder.toString();
}
}
aW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLnRleHQuTm9ybWFsaXplcjsKaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuKjsKaW1wb3J0IGphdmEuaW8uKjsKCmNsYXNzIElkZW9uZQp7CglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nW10gYXJncykgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24KCXsKCQlTeXN0ZW0ub3V0LnByaW50bG4oY29udmVydFRvSXNvODg1OTFXaXRoQ29kZXBvaW50TmFtZXMoIkhlbGxvIFx1RDgzRFx1REUwMCBcdUQ4MzVcdURDMkUgZnJhcHDDqSwgbmHDr3ZlLCBzb3VmZmzDqSIpKTsKCX0KCiAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9Jc284ODU5MVdpdGhDb2RlcG9pbnROYW1lcyhTdHJpbmcgaW5wdXQpIHsKICAgIAkvLyBOb3JtYWxpemUgdG8gcmVwbGFjZSBhcyBtdWNoIGFzIHBvc3NpYmxlIHdpdGggbm9ybWFsIGNoYXJhY3RlciBmb3JtcwogICAgCWlucHV0ID0gTm9ybWFsaXplci5ub3JtYWxpemUoaW5wdXQsIE5vcm1hbGl6ZXIuRm9ybS5ORktDKTsKICAgIAkKICAgIAkvLyBUaGVuIHN1YnN0aXR1dGUgYXMgcmVxdWlyZWQgaW50byB0aGUgdGFyZ2V0IGNoYXJzZXQKICAgICAgICBDaGFyc2V0RW5jb2RlciBlbmNvZGVyID0gU3RhbmRhcmRDaGFyc2V0cy5JU09fODg1OV8xLm5ld0VuY29kZXIoKTsKICAgICAgICBTdHJpbmdCdWlsZGVyIHJlc3VsdEJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogICAgICAgIAogICAgICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCB0aGUgc3RyaW5nIGJ5IGNvZGVwb2ludAogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5wdXQubGVuZ3RoKCk7ICkgewogICAgICAgICAgICBpbnQgY29kZVBvaW50ID0gaW5wdXQuY29kZVBvaW50QXQoaSk7CiAgICAgICAgICAgIAogICAgICAgICAgICBTdHJpbmcgdXRmMTZjaGFycyA9IENoYXJhY3Rlci50b1N0cmluZyhjb2RlUG9pbnQpOwogICAgICAgICAgICBpZiAoZW5jb2Rlci5jYW5FbmNvZGUodXRmMTZjaGFycykpIHsKICAgICAgICAgICAgICAgIHJlc3VsdEJ1aWxkZXIuYXBwZW5kKHV0ZjE2Y2hhcnMpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgLy8gQ2hhcmFjdGVyIGlzIE5PVCBlbmNvZGFibGUsIHJlcGxhY2Ugd2l0aCBpdHMgVW5pY29kZSBjb2RlcG9pbnQgbmFtZQogICAgICAgICAgICAgICAgcmVzdWx0QnVpbGRlci5hcHBlbmQoJ1snKTsKICAgICAgICAgICAgICAgIHJlc3VsdEJ1aWxkZXIuYXBwZW5kKENoYXJhY3Rlci5nZXROYW1lKGNvZGVQb2ludCkpOwogICAgICAgICAgICAgICAgcmVzdWx0QnVpbGRlci5hcHBlbmQoJ10nKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgaSArPSB1dGYxNmNoYXJzLmxlbmd0aCgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0QnVpbGRlci50b1N0cmluZygpOwogICAgfQp9