#java #character-encoding #special-characters #emoji #codepoint
Вопрос:
Может показаться, что на этот вопрос уже есть ответ, но я нигде не мог его найти.
Как мне получить первый печатаемый символ на Java?
Например
abcd //should return "a" - The first printable char is of 1 bytes
😀😀 //should return "😀" - The first printable char is of 4 bytes (2 codepoints)
"😀".length() //2 - I guess thats because of 2 codepoints
☠😀☠ //should return ☠ - The first printable char is of 1 bytes
🇮🇳😀 //should return 🇮🇳 - The first printable char is of 8 bytes (4 codepoints)
🇮🇳abcd //should return 🇮🇳 - The first printable char is of 8 bytes (4 codepoints)
Комментарии:
1. разве
String::charAt(0)
это не сработало бы?2. нет. Потому что, как упоминалось в вопросе, символ для печати может иметь переменную длину в байтах.
String::charAt(0)
возвращает только 1-й байт3. а как насчет регулярного
^.
выражения ?4. На самом деле неясно, что именно вы хотите знать. Получение первой кодовой точки (которая может быть двумя
char
значениями (не байтами!)) это можно сделать, делаяString.codepointAt(0)
. Но это не гарантирует, что вы получите одного полного персонажа, воспринимаемого пользователем . Пожалуйста, расскажите нам, зачем вам это нужно, чтобы мы могли лучше понять, что именно вам нужно. Это может закончиться проблемой XY .5. Это звучит так, как будто вам действительно нужна первая графема (которая в основном соответствует наивному понятию «первый символ», которое видит пользователь). Это может быть несколько кодовых точек. Я думаю
BreakIterator.getCharacterInstance(Locale)
, это может помочь.