Subodh Nijsure
09/03/2022, 10:34 PMSiyamed
09/03/2022, 10:36 PMSubodh Nijsure
09/03/2022, 10:51 PMSiyamed
09/03/2022, 10:53 PMSubodh Nijsure
09/03/2022, 10:58 PMSubodh Nijsure
09/03/2022, 11:30 PMSubodh Nijsure
09/03/2022, 11:34 PMprivate fun printMe(
spannableText: SpannableStringBuilder,
) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
val byteArray16 = spannableText.toString().toByteArray(Charsets.UTF_16)
val byteArray8 = spannableText.toString().toByteArray(Charsets.UTF_8)
val cpArray = spannableText.toString().codePoints().toArray()
Logger.debug("EMOJI", spannableText.toString())
Logger.debug("EMOJI",
"Spannable length ${spannableText.length} String len ${spannableText.toString().length} Codepoint count " +
spannableText.toString().codePointCount(0, spannableText.toString().length),
)
var str8 = ""
var str16 = ""
var strCp = ""
byteArray8.forEachIndexed { index: Int, byte: Byte ->
str8 += "$index 0x" + byte.toHexString() + " "
}
byteArray16.forEachIndexed { index: Int, byte: Byte ->
str16 += "$index 0x" + byte.toHexString() + " "
}
cpArray.forEachIndexed { index, cp ->
strCp += "$index 0x" + cp.toHexString() + " "
}
Logger.debug("EMOJI", "UTF_8 $str8")
Logger.debug("EMOJI", "UTF_16 $str8")
Logger.debug("EMOJI", "CodePoint $strCp")
}
}
And this is the output I see D EMOJI : 🙏🙏
D EMOJI : Spannable length 4 String len 4 Codepoint count 2
D EMOJI : UTF_8 0 0xf0 1 0x9f 2 0x99 3 0x8f 4 0xf0 5 0x9f 6 0x99 7 0x8f
D EMOJI : UTF_16 0 0xf0 1 0x9f 2 0x99 3 0x8f 4 0xf0 5 0x9f 6 0x99 7 0x8f
D EMOJI : CodePoint 0 0x1f64f 1 0x1f64fSubodh Nijsure
09/05/2022, 4:00 AMval spannableText = SpannableString("x\uD83D\uDE4F")
val urlSpan = URLSpan("<https://www.google.com/>")
spannableText.setSpan(
urlSpan,
1,
2,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
)
That produces output that looks like this:
In above example if I set start and end position of the span "correctly" over the entire emoji things look correct.
val spannableText = SpannableString("x\uD83D\uDE4F")
val urlSpan = URLSpan("<https://www.google.com/>")
spannableText.setSpan(
urlSpan,
1,
3,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
)
I have code that builds complex spannable, so I got computation of span length wrong when there is codepoint/emoji in the string.
I "distilled" my issue above. Posting an update here, in case someone runs into this in the future. I had posted query here too -- https://stackoverflow.com/questions/73595754/android-issue-with-rendering-emoji/73604405#73604405andrew
09/29/2022, 12:47 AM