Возможно, Вирт сосредоточился на компиляторах и оставил среду исполнения на второй план. Для нее требуется составлять отдельный список требований, включая совместимость с кодировками. Этого трудно достичь из-за больших различий сред, поэтому Вирт мог предпочесть не влезать в дебри.
Эмм... А среда исполнения тут вообще не при чем. Смотри:
MODULE Test;
IMPORT Out;
BEGIN
Out.WriteLn("Hello, 世界, Привет!")
END Test.
А теперь представим себе что у нас есть единая среда исполнения и два компилятора с единым парсером но разными лексерами. Один лексер ожидает множество символов Latin-1, а другой лексер ожидает UTF-8. И мы им скармливаем этот пример. Как думаешь, что будет? :-)
Мало того, что Latin-1 лексер не осилит эту программу as is, мы её даже не сможем автоматически сконвертировать в вид приемлемый для него (без потерь информации и без знания деталей реализации рантайма). А ведь это часть семантики.
Ну, а про то, что кроме строковых литералов существуют еще и, например, идентификаторы, я вообще молчу.
Вирт мог бы написать, что используемое множество символов (charset) - unicode. Без уточнения конкретной кодировки (utf-8, utf-16, utf-32, ucs-2 и так далее). Вот тогда было бы полное (в данном месте) определение семантики без уточнения конкретной реализации, и это позволило бы писать совместимые компиляторы (то есть код для одного компилятора после простейшей автоматической обработки/конвертации (банальное преобразование скажем из utf-32 -> utf-8) будет собираться другим компилятором). Кроме того была бы достигнута совместимость снизу вверх.