import java.util.*;
import java.lang.*;
import java.text.Normalizer;
import java.nio.charset.*;
import java.io.*;
class Ideone
{
{
System.
out.
println(convertTo7BitAsciiWithCodepointNames
("Hello \uD83D\uDE00 \uD835\uDC2E frappé, naïve, soufflé")); }
public static String convertTo7BitAsciiWithCodepointNames
(String input
) { // Normalize to replace as much as possible with normal character forms
input = Normalizer.normalize(input, Normalizer.Form.NFKD);
// 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);
// ignore combining accent characters
} else 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();
}
}
aW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLnRleHQuTm9ybWFsaXplcjsKaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuKjsKaW1wb3J0IGphdmEuaW8uKjsKCmNsYXNzIElkZW9uZQp7CglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nW10gYXJncykgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24KCXsKCQlTeXN0ZW0ub3V0LnByaW50bG4oY29udmVydFRvN0JpdEFzY2lpV2l0aENvZGVwb2ludE5hbWVzKCJIZWxsbyBcdUQ4M0RcdURFMDAgXHVEODM1XHVEQzJFIGZyYXBww6ksIG5hw692ZSwgc291ZmZsw6kiKSk7Cgl9CgogICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFRvN0JpdEFzY2lpV2l0aENvZGVwb2ludE5hbWVzKFN0cmluZyBpbnB1dCkgewogICAgCS8vIE5vcm1hbGl6ZSB0byByZXBsYWNlIGFzIG11Y2ggYXMgcG9zc2libGUgd2l0aCBub3JtYWwgY2hhcmFjdGVyIGZvcm1zCiAgICAJaW5wdXQgPSBOb3JtYWxpemVyLm5vcm1hbGl6ZShpbnB1dCwgTm9ybWFsaXplci5Gb3JtLk5GS0QpOwogICAgCQogICAgCS8vIFRoZW4gc3Vic3RpdHV0ZSBhcyByZXF1aXJlZCBpbnRvIHRoZSB0YXJnZXQgY2hhcnNldAogICAgICAgIENoYXJzZXRFbmNvZGVyIGVuY29kZXIgPSBTdGFuZGFyZENoYXJzZXRzLklTT184ODU5XzEubmV3RW5jb2RlcigpOwogICAgICAgIFN0cmluZ0J1aWxkZXIgcmVzdWx0QnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CiAgICAgICAgCiAgICAgICAgLy8gSXRlcmF0ZSB0aHJvdWdoIHRoZSBzdHJpbmcgYnkgY29kZXBvaW50CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnB1dC5sZW5ndGgoKTsgKSB7CiAgICAgICAgICAgIGludCBjb2RlUG9pbnQgPSBpbnB1dC5jb2RlUG9pbnRBdChpKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIFN0cmluZyB1dGYxNmNoYXJzID0gQ2hhcmFjdGVyLnRvU3RyaW5nKGNvZGVQb2ludCk7CiAgICAgICAgICAgIGlmIChDaGFyYWN0ZXIuZ2V0VHlwZShjb2RlUG9pbnQpID09IENoYXJhY3Rlci5OT05fU1BBQ0lOR19NQVJLKSB7CiAgICAgICAgICAgIAkvLyBpZ25vcmUgY29tYmluaW5nIGFjY2VudCBjaGFyYWN0ZXJzCiAgICAgICAgCX0gZWxzZSBpZiAoZW5jb2Rlci5jYW5FbmNvZGUodXRmMTZjaGFycykpIHsKICAgICAgICAgICAgICAgIHJlc3VsdEJ1aWxkZXIuYXBwZW5kKHV0ZjE2Y2hhcnMpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgLy8gQ2hhcmFjdGVyIGlzIE5PVCBlbmNvZGFibGUsIHJlcGxhY2Ugd2l0aCBpdHMgVW5pY29kZSBjb2RlcG9pbnQgbmFtZQogICAgICAgICAgICAgICAgcmVzdWx0QnVpbGRlci5hcHBlbmQoJ1snKTsKICAgICAgICAgICAgICAgIHJlc3VsdEJ1aWxkZXIuYXBwZW5kKENoYXJhY3Rlci5nZXROYW1lKGNvZGVQb2ludCkpOwogICAgICAgICAgICAgICAgcmVzdWx0QnVpbGRlci5hcHBlbmQoJ10nKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgaSArPSB1dGYxNmNoYXJzLmxlbmd0aCgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0QnVpbGRlci50b1N0cmluZygpOwogICAgfQp9