MODULE WMCharCodes;
IMPORT
Strings, UTF8Strings, Files, Streams;
VAR
gb2312Table : ARRAY 65536 OF LONGINT;
PROCEDURE GB2312ToUTF8*(from : Strings.String) : Strings.String;
VAR buf : Strings.Buffer;
w : Streams.Writer;
temp : ARRAY 8 OF CHAR;
i, code, len : LONGINT;
BEGIN
NEW(buf, LEN(from) * 2);
w := buf.GetWriter();
i := 0;
WHILE i < LEN(from) - 1 DO
code := ORD(from[i]) * 256 + ORD(from[i + 1]);
INC(i, 2);
IF UTF8Strings.EncodeChar(gb2312Table[code MOD 10000H], temp, len) THEN
w.String(temp)
ELSE
w.Char("*")
END;
END;
RETURN buf.GetString()
END GB2312ToUTF8;
PROCEDURE LoadGBTable;
VAR f : Files.File;
r : Files.Reader;
codeS, unicodeS : ARRAY 8 OF CHAR;
code, unicode, res : LONGINT;
BEGIN
f := Files.Old("gb2312.txt");
Files.OpenReader(r, f, 0);
WHILE r.res = 0 DO
IF r.Peek() = "#" THEN r.SkipLn
ELSE
IF r.Peek() = "0" THEN
r.Token(codeS); r.SkipWhitespace; r.Token(unicodeS); r.SkipLn;
Strings.Delete(codeS, 0, 2);
Strings.HexStrToInt(codeS, code, res);
Strings.Delete(unicodeS, 0, 2);
Strings.HexStrToInt(unicodeS, unicode, res);
gb2312Table[code MOD 10000H] := unicode;
ELSE r.SkipLn;
END;
END;
END;
END LoadGBTable;
BEGIN
LoadGBTable;
END WMCharCodes.
WMCharCodes.MakeCodePage ~
SystemTools.Free WMCharCodes ~