I haven't found anything that works, so I rolled my own.
a2.png
Language: avisynth
bc=blankclip(color=$008888)
my_str="""
hello world?
well isn't that grand???
world hello"""
layer(bc,showstr(my_str))
function ng_sv(clip clp1, clip clp2){
w1=clp1.width
h1=clp1.height
w2=clp2.width
h2=clp2.height
clp1 = (w1 < w2) ? stackhorizontal(clp1,blankclip(1,w2-w1,h1,color=$00000000)) : clp1
clp2 = (w1 > w2) ? stackhorizontal(clp2,blankclip(1,w1-w2,h2,color=$00000000)) : clp2
stackvertical(clp1,clp2)
}
function showstr(string str){
#chr(13)=\n
#there is a newline and carriage return
nl=findstr(str,chr(13))
(nl > 0) ? ng_sv(showline(leftstr(str, nl-1)),showstr(midstr(str,nl+2))) : showline(str)
}
function showline(string str){
(strlen(str) >1) ? stackhorizontal(showchr(str),showline(midstr(str,2))) : showchr(str)
}
function showchr(string str){
imagesource("a2.png",pixel_type="RGB32")
char_w=width /32
char_h=height /3
or=ord(str)
or = (or < 32 || or > 128) ? 32 : or
a=(or %32) *char_w
b=(or /32 -1) *char_h
crop(a,b, char_w,char_h)
}