Вам нужно будет извлечь каждую кодовую точку / единицу из строки и кодировать ее самостоятельно.Следующее работает для всех строк, даже если отдельные лингвистические символы в строке состоят из орграфов или лигатур.
public String getUnicodeEscapes(String aString)
{
if (aString != null && aString.length() > 0)
{
int length = aString.length();
StringBuilder buffer = new StringBuilder(length);
for (int ctr = 0; ctr < length; ctr++)
{
char codeUnit = aString.charAt(ctr);
String hexString = Integer.toHexString(codeUnit);
String padAmount = "0000".substring(hexString.length());
buffer.append("\\u");
buffer.append(padAmount);
buffer.append(hexString);
}
return buffer.toString();
}
else
{
return null;
}
}
Приведенный выше вывод выводится в соответствии со спецификацией языка Java для Unicode escapes , то есть он производит вывод вида \uxxxx
для каждой кодовой единицы UTF-16 .Он обращается к дополнительным символам путем создания пары кодовых единиц, представленных как \uxxxx\uyyyy
.
Первоначально опубликованный код был изменен для получения кодовых точек Unicode в формате U+FFFFF
:
public String getUnicodeCodepoints(String aString)
{
if (aString != null && aString.length() > 0)
{
int length = aString.length();
StringBuilder buffer = new StringBuilder(length);
for (int ctr = 0; ctr < length; ctr++)
{
char ch = aString.charAt(ctr);
if (Character.isLowSurrogate(ch))
{
continue;
}
else
{
int codePoint = aString.codePointAt(ctr);
String hexString = Integer.toHexString(codePoint);
String zeroPad = Character.isHighSurrogate(ch) ? "00000" : "0000";
String padAmount = zeroPad.substring(hexString.length());
buffer.append(" U+");
buffer.append(padAmount);
buffer.append(hexString);
}
}
return buffer.toString();
}
else
{
return null;
}
}
Gruntwork выполняется методом String.codePointAt () , который возвращает кодовую точку Unicode с определенным индексом.Для экземпляра String, состоящего из комбинационных символов, длина экземпляра String будет не длиной числа видимых символов, а количеством фактических кодовых точек Unicode.Например, क
и ्
объединяются в форму क्
в Деванагари, и вышеуказанная функция по праву вернет U+0915 U+094d
без суеты, так как String.length()
вернет 2 для объединенного символа.Строки с дополнительными символами будут с отдельными кодовыми точками для отдельных символов - ??????????
(страница не будет правильно отображать этот строковый литерал, но вы можете скопировать его просто отлично; он должен быть Javascript
, но записан с использованием дополнительного набора символов для Математические буквенно-цифровые символы ) вернут U+1d4a5 U+1d4b6 U+1d4cb U+1d4b6 U+1d4c8 U+1d4b8 U+1d4c7 U+1d4be U+1d4c5 U+1d4c9
.