Unfortunately, giving you the full context pretty much gives the answer away, but this sorta functions as a hint:
The UI library supported Japanese.
And if you still don’t have it:
Multi-byte characters were getting snipped mid-character. The basic red flag is that you’re passing COLS (presumably columns, a character offset) to substr, a function that takes a byte offset.