В документации к языку написано, что функция конвертирует только символы из Latin-1. Следовательно, стоит ожидать, что символы вне Latin1 она не изменит. Для русских символов была написана примитивная функция "капитализации". однако.
Код:
MODULE PrivTest;
IMPORT Log;
PROCEDURE Cap* (ch: CHAR): CHAR;
VAR res: CHAR;
BEGIN
res := CAP(ch);
CASE res OF
'а': res := 'А' | 'б': res := 'Б' | 'в': res := 'В' | 'г': res := 'Г' | 'д': res := 'Д' |
'е': res := 'Е' | 'ё': res := 'Ё' | 'ж': res := 'Ж' | 'з': res := 'З' | 'и': res := 'И' |
'й': res := 'И' | 'к': res := 'К' | 'л': res := 'Л' | 'м': res := 'М' | 'н': res := 'Н' |
'о': res := 'О' | 'п': res := 'П' | 'р': res := 'Р' | 'с': res := 'С' | 'т': res := 'Т' |
'у': res := 'У' | 'ф': res := 'Ф' | 'х': res := 'Х' | 'ц': res := 'Ц' | 'ч': res := 'Ч' |
'ш': res := 'Ш' | 'щ': res := 'Щ' | 'ъ': res := 'Ъ' | 'ы': res := 'Ы' | 'ь': res := 'Ь' |
'э': res := 'Э' | 'ю': res := 'Ю' | 'я': res := 'Я'
ELSE
END;
RETURN res
END Cap;
PROCEDURE CapThis(VAR s: ARRAY OF CHAR);
VAR i: INTEGER;
BEGIN
FOR i:=0 TO LEN(s$)-1 DO s[i]:=Cap(s[i]) END;
END CapThis;
PROCEDURE Do*;
VAR s: ARRAY 128 OF CHAR;
BEGIN
s:='abcdefghijklmnopqrstuvwxyzабвгдеёжзиклмнопрстуфхцчшщъыьэюя';
CapThis(s); Log.Ln; Log.String(s$);
s:='ABCDEFGHIJKLMNOPQRSTUVWXYZАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ';
CapThis(s); Log.Ln; Log.String(s$);
END Do;
END PrivTest.
PrivTest.Do
на выходе получаем:
Код:
ABCDEFGHIJKLMNOPQRSTUVWXYZАБВГДЕЁЖЗИКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ
ABCDEFGHIJKLMNOPQRSTUVWXYZАБВГДЕЁЖЗИЙКЛМНОПЀЁЂЃЄЅІЇЈЉЊЋЌЍЎЏ
то есть, похоже, что все символы в {Р .. Я} портятся в CAP.
наверное, тема относится к русификации в большей мере