import java.util.*;
import java.lang.*;
import java.text.Normalizer;
import java.nio.charset.*;
import java.io.*;
class Ideone
{
{
System.
out.
println(convertTo7BitAsciiWithCodepointNames
("Hello µ \u03bc \u00b5 \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();
}
}
aW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLnRleHQuTm9ybWFsaXplcjsKaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuKjsKaW1wb3J0IGphdmEuaW8uKjsKCmNsYXNzIElkZW9uZQp7CglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nW10gYXJncykgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24KCXsKCQlTeXN0ZW0ub3V0LnByaW50bG4oY29udmVydFRvN0JpdEFzY2lpV2l0aENvZGVwb2ludE5hbWVzKCJIZWxsbyDCtSBcdTAzYmMgXHUwMGI1IFx1RDgzRFx1REUwMCBcdUQ4MzVcdURDMkUgZnJhcHDDqSwgbmHDr3ZlLCBzb3VmZmzDqSIpKTsKCX0KCiAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VG83Qml0QXNjaWlXaXRoQ29kZXBvaW50TmFtZXMoU3RyaW5nIGlucHV0KSB7CiAgICAJLy8gTm9ybWFsaXplIHRvIHJlcGxhY2UgYXMgbXVjaCBhcyBwb3NzaWJsZSB3aXRoIG5vcm1hbCBjaGFyYWN0ZXIgZm9ybXMKICAgIAlpbnB1dCA9IE5vcm1hbGl6ZXIubm9ybWFsaXplKGlucHV0LCBOb3JtYWxpemVyLkZvcm0uTkZLRCk7CiAgICAJCiAgICAJLy8gVGhlbiBzdWJzdGl0dXRlIGFzIHJlcXVpcmVkIGludG8gdGhlIHRhcmdldCBjaGFyc2V0CiAgICAgICAgQ2hhcnNldEVuY29kZXIgZW5jb2RlciA9IFN0YW5kYXJkQ2hhcnNldHMuSVNPXzg4NTlfMS5uZXdFbmNvZGVyKCk7CiAgICAgICAgU3RyaW5nQnVpbGRlciByZXN1bHRCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKICAgICAgICAKICAgICAgICAvLyBJdGVyYXRlIHRocm91Z2ggdGhlIHN0cmluZyBieSBjb2RlcG9pbnQKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGlucHV0Lmxlbmd0aCgpOyApIHsKICAgICAgICAgICAgaW50IGNvZGVQb2ludCA9IGlucHV0LmNvZGVQb2ludEF0KGkpOwogICAgICAgICAgICAKICAgICAgICAgICAgU3RyaW5nIHV0ZjE2Y2hhcnMgPSBDaGFyYWN0ZXIudG9TdHJpbmcoY29kZVBvaW50KTsKICAgICAgICAgICAgaWYgKENoYXJhY3Rlci5nZXRUeXBlKGNvZGVQb2ludCkgPT0gQ2hhcmFjdGVyLk5PTl9TUEFDSU5HX01BUkspIHsKICAgICAgICAgICAgCS8vIGlnbm9yZSBjb21iaW5pbmcgYWNjZW50IGNoYXJhY3RlcnMKICAgICAgICAJfSBlbHNlIGlmIChlbmNvZGVyLmNhbkVuY29kZSh1dGYxNmNoYXJzKSkgewogICAgICAgICAgICAgICAgcmVzdWx0QnVpbGRlci5hcHBlbmQodXRmMTZjaGFycyk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAvLyBDaGFyYWN0ZXIgaXMgTk9UIGVuY29kYWJsZSwgcmVwbGFjZSB3aXRoIGl0cyBVbmljb2RlIGNvZGVwb2ludCBuYW1lCiAgICAgICAgICAgICAgICByZXN1bHRCdWlsZGVyLmFwcGVuZCgnWycpOwogICAgICAgICAgICAgICAgcmVzdWx0QnVpbGRlci5hcHBlbmQoQ2hhcmFjdGVyLmdldE5hbWUoY29kZVBvaW50KSk7CiAgICAgICAgICAgICAgICByZXN1bHRCdWlsZGVyLmFwcGVuZCgnXScpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICBpICs9IHV0ZjE2Y2hhcnMubGVuZ3RoKCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHRCdWlsZGVyLnRvU3RyaW5nKCk7CiAgICB9Cn0=