Looking at this quickly, I think the main issue is that you’re treating StorageForShortName as a word array (i.e. an array of 4-byte fields, since you’re on Glulx) instead of as a byte array (see page 42 of the DM4). The syntax “array–>index” is used for word arrays, and the syntax “array->index” for byte arrays. If you use the wrong one you’ll end up indexing into the wrong location within the array, or reading multiple entries as a single entry (hence the random-looking unicode characters). In the context of PrefaceByArticle, it appears that StorageForShortName is being used as a byte array, written using a Glk memory stream and so with no initial entry storing the length. Since your I6Buffer is a word array, this means you want to use code likeI6Buffer-->0 = 10;
for (i=0:i<10:i++) I6Buffer-->(i+1) = text->i;
This appears to work as you want, except that you get junk on the end when the length of the text in StorageForShortName is actually less than 10. For finding the real length, it looks like Glulx_PrintAnyToArray returns the length of the text printed (although only 160 characters at most will be stored in this case), so you could save that return value.
Since StorageForShortName is being used as a byte array here and can’t store unicode characters (if I understand correctly they will be converted to ‘?’ by Glk), you might as well save memory by using I6Buffer as a byte array (with ‘->’ everywhere instead of ‘–>’) and glk_put_char instead of glk_put_char_uni.