Получить первый печатаемый символ из строки

#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) , это может помочь.