summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGraeme Geldenhuys <graeme@mastermaths.co.za>2010-09-20 09:12:39 +0200
committerGraeme Geldenhuys <graeme@mastermaths.co.za>2010-09-20 09:12:39 +0200
commit76adf3bc4158a3785980d5c1c66ec7a6702001f1 (patch)
tree2b4aa2fad7a385ba5559d313eef46987f73b070b
parentf819c8528a09b331876e5f62a5cad8aae522fa54 (diff)
downloadfpGUI-76adf3bc4158a3785980d5c1c66ec7a6702001f1.tar.xz
Introduced code page conversion routines
fpg_stringutils unit now has various code page conversion routines * CP437ToUTF8 * CP850ToUTF8 * IBMGraphToUTF8 - special encoding often used under OS/2 * IPFToUTF8 - special conversion for use with DocView and old OS/2 INF files.
-rw-r--r--src/corelib/fpg_stringutils.pas1151
1 files changed, 1151 insertions, 0 deletions
diff --git a/src/corelib/fpg_stringutils.pas b/src/corelib/fpg_stringutils.pas
index 3e54e02b..54bfd6b8 100644
--- a/src/corelib/fpg_stringutils.pas
+++ b/src/corelib/fpg_stringutils.pas
@@ -25,6 +25,9 @@ interface
uses
Classes, SysUtils, fpg_base;
+type
+ TCharToUTF8Table = array[char] of PChar;
+
function UTF8CharacterLength(p: PChar): integer;
function UTF8CharStart(UTF8Str: PChar; Len, Index: integer): PChar;
@@ -51,6 +54,14 @@ function fpgRemovePathDelim(const Path: TfpgString): TfpgString;
function fpgTrimR(const AString, ATrim: TfpgString; ACaseSensitive: boolean = false): TfpgString;
+// Encoding conversions
+function CP437ToUTF8(const s: string): TfpgString; // DOS central europe
+function CP850ToUTF8(const s: string): TfpgString; // DOS western europe
+function IBMGraphToUTF8(const s: string): TfpgString; // IBM PC / DOS http://www.unicode.org/Public/MAPPINGS/VENDORS/MISC/IBMGRAPH.TXT
+function IPFToUTF8(const s: string): TfpgString; // minor replacements to improve DocView output
+function SingleByteToUTF8(const s: string; const Table: TCharToUTF8Table): TfpgString;
+
+
implementation
@@ -352,6 +363,1146 @@ begin
Result := AString;
end;
+const
+ ArrayCP437ToUTF8 : TCharToUTF8Table = (
+ #0, // #0
+ #1, // #1
+ #2, // #2
+ #3, // #3
+ #4, // #4
+ #5, // #5
+ #6, // #6
+ #$E2#$80#$A2, // #7 bullet
+ #8, // #8
+ #9, // #9
+ #10, // #10
+ #11, // #11
+ #12, // #12
+ #13, // #13
+ #14, // #14
+ #15, // #15
+ #16, // #16
+ #17, // #17
+ #18, // #18
+ #19, // #19
+ #20, // #20
+ #21, // #21
+ #22, // #22
+ #23, // #23
+ #$E2#$86#$91, // #24 up arrow
+ #$E2#$86#$93, // #25 down arrow
+ #$E2#$86#$92, // #26 right arrow
+ #$E2#$86#$90, // #27 left arrow
+ #28, // #28
+ #29, // #29
+ #30, // #30
+ #31, // #31
+ ' ', // ' '
+ '!', // '!'
+ '"', // '"'
+ '#', // '#'
+ '$', // '$'
+ '%', // '%'
+ '&', // '&'
+ '''', // ''''
+ '(', // '('
+ ')', // ')'
+ '*', // '*'
+ '+', // '+'
+ ',', // ','
+ '-', // '-'
+ '.', // '.'
+ '/', // '/'
+ '0', // '0'
+ '1', // '1'
+ '2', // '2'
+ '3', // '3'
+ '4', // '4'
+ '5', // '5'
+ '6', // '6'
+ '7', // '7'
+ '8', // '8'
+ '9', // '9'
+ ':', // ':'
+ ';', // ';'
+ '<', // '<'
+ '=', // '='
+ '>', // '>'
+ '?', // '?'
+ '@', // '@'
+ 'A', // 'A'
+ 'B', // 'B'
+ 'C', // 'C'
+ 'D', // 'D'
+ 'E', // 'E'
+ 'F', // 'F'
+ 'G', // 'G'
+ 'H', // 'H'
+ 'I', // 'I'
+ 'J', // 'J'
+ 'K', // 'K'
+ 'L', // 'L'
+ 'M', // 'M'
+ 'N', // 'N'
+ 'O', // 'O'
+ 'P', // 'P'
+ 'Q', // 'Q'
+ 'R', // 'R'
+ 'S', // 'S'
+ 'T', // 'T'
+ 'U', // 'U'
+ 'V', // 'V'
+ 'W', // 'W'
+ 'X', // 'X'
+ 'Y', // 'Y'
+ 'Z', // 'Z'
+ '[', // '['
+ '\', // '\'
+ ']', // ']'
+ '^', // '^'
+ '_', // '_'
+ '`', // '`'
+ 'a', // 'a'
+ 'b', // 'b'
+ 'c', // 'c'
+ 'd', // 'd'
+ 'e', // 'e'
+ 'f', // 'f'
+ 'g', // 'g'
+ 'h', // 'h'
+ 'i', // 'i'
+ 'j', // 'j'
+ 'k', // 'k'
+ 'l', // 'l'
+ 'm', // 'm'
+ 'n', // 'n'
+ 'o', // 'o'
+ 'p', // 'p'
+ 'q', // 'q'
+ 'r', // 'r'
+ 's', // 's'
+ 't', // 't'
+ 'u', // 'u'
+ 'v', // 'v'
+ 'w', // 'w'
+ 'x', // 'x'
+ 'y', // 'y'
+ 'z', // 'z'
+ '{', // '{'
+ '|', // '|'
+ '}', // '}'
+ '~', // '~'
+ #127, // #127
+ #195#135, // #128
+ #195#188, // #129
+ #195#169, // #130
+ #195#162, // #131
+ #195#164, // #132
+ #195#160, // #133
+ #195#165, // #134
+ #195#167, // #135
+ #195#170, // #136
+ #195#171, // #137
+ #195#168, // #138
+ #195#175, // #139
+ #195#174, // #140
+ #195#172, // #141
+ #195#132, // #142
+ #195#133, // #143
+ #195#137, // #144
+ #195#166, // #145
+ #195#134, // #146
+ #195#180, // #147
+ #195#182, // #148
+ #195#178, // #149
+ #195#187, // #150
+ #195#185, // #151
+ #195#191, // #152
+ #195#150, // #153
+ #195#156, // #154
+ #194#162, // #155
+ #194#163, // #156
+ #194#165, // #157
+ #226#130#167, // #158
+ #198#146, // #159
+ #195#161, // #160
+ #195#173, // #161
+ #195#179, // #162
+ #195#186, // #163
+ #195#177, // #164
+ #195#145, // #165
+ #194#170, // #166
+ #194#186, // #167
+ #194#191, // #168
+ #226#140#144, // #169
+ #194#172, // #170
+ #194#189, // #171
+ #194#188, // #172
+ #194#161, // #173
+ #194#171, // #174
+ #194#187, // #175
+ #226#150#145, // #176
+ #226#150#146, // #177
+ #226#150#147, // #178
+ #226#148#130, // #179
+ #226#148#164, // #180
+ #226#149#161, // #181
+ #226#149#162, // #182
+ #226#149#150, // #183
+ #226#149#149, // #184
+ #226#149#163, // #185
+ #226#149#145, // #186
+ #226#149#151, // #187
+ #226#149#157, // #188
+ #226#149#156, // #189
+ #226#149#155, // #190
+ #226#148#144, // #191
+ #226#148#148, // #192
+ #226#148#180, // #193
+ #226#148#172, // #194
+ #226#148#156, // #195
+ #226#148#128, // #196
+ #226#148#188, // #197
+ #226#149#158, // #198
+ #226#149#159, // #199
+ #226#149#154, // #200
+ #226#149#148, // #201
+ #226#149#169, // #202
+ #226#149#166, // #203
+ #226#149#160, // #204
+ #226#149#144, // #205
+ #226#149#172, // #206
+ #226#149#167, // #207
+ #226#149#168, // #208
+ #226#149#164, // #209
+ #226#149#165, // #210
+ #226#149#153, // #211
+ #226#149#152, // #212
+ #226#149#146, // #213
+ #226#149#147, // #214
+ #226#149#171, // #215
+ #226#149#170, // #216
+ #226#148#152, // #217
+ #226#148#140, // #218
+ #226#150#136, // #219
+ #226#150#132, // #220
+ #226#150#140, // #221
+ #226#150#144, // #222
+ #226#150#128, // #223
+ #206#177, // #224
+ #195#159, // #225
+ #206#147, // #226
+ #207#128, // #227
+ #206#163, // #228
+ #207#131, // #229
+ #194#181, // #230
+ #207#132, // #231
+ #206#166, // #232
+ #206#152, // #233
+ #206#169, // #234
+ #206#180, // #235
+ #226#136#158, // #236
+ #207#134, // #237
+ #206#181, // #238
+ #226#136#169, // #239
+ #226#137#161, // #240
+ #194#177, // #241
+ #226#137#165, // #242
+ #226#137#164, // #243
+ #226#140#160, // #244
+ #226#140#161, // #245
+ #195#183, // #246
+ #226#137#136, // #247
+ #194#176, // #248
+ #226#136#153, // #249
+ #194#183, // #250
+ #226#136#154, // #251
+ #226#129#191, // #252
+ #194#178, // #253
+ #226#150#160, // #254
+ #194#160 // #255
+ );
+
+ ArrayCP850ToUTF8 : TCharToUTF8Table = (
+ #0, // #0
+ #1, // #1
+ #2, // #2
+ #3, // #3
+ #4, // #4
+ #5, // #5
+ #6, // #6
+ #$E2#$80#$A2, // #7 bullet
+ #8, // #8
+ #9, // #9
+ #10, // #10
+ #11, // #11
+ #12, // #12
+ #13, // #13
+ #14, // #14
+ #15, // #15
+ #16, // #16
+ #17, // #17
+ #18, // #18
+ #19, // #19
+ #20, // #20
+ #21, // #21
+ #22, // #22
+ #23, // #23
+ #24, // #24
+ #25, // #25
+ #26, // #26
+ #27, // #27
+ #28, // #28
+ #29, // #29
+ #30, // #30
+ #31, // #31
+ ' ', // ' '
+ '!', // '!'
+ '"', // '"'
+ '#', // '#'
+ '$', // '$'
+ '%', // '%'
+ '&', // '&'
+ '''', // ''''
+ '(', // '('
+ ')', // ')'
+ '*', // '*'
+ '+', // '+'
+ ',', // ','
+ '-', // '-'
+ '.', // '.'
+ '/', // '/'
+ '0', // '0'
+ '1', // '1'
+ '2', // '2'
+ '3', // '3'
+ '4', // '4'
+ '5', // '5'
+ '6', // '6'
+ '7', // '7'
+ '8', // '8'
+ '9', // '9'
+ ':', // ':'
+ ';', // ';'
+ '<', // '<'
+ '=', // '='
+ '>', // '>'
+ '?', // '?'
+ '@', // '@'
+ 'A', // 'A'
+ 'B', // 'B'
+ 'C', // 'C'
+ 'D', // 'D'
+ 'E', // 'E'
+ 'F', // 'F'
+ 'G', // 'G'
+ 'H', // 'H'
+ 'I', // 'I'
+ 'J', // 'J'
+ 'K', // 'K'
+ 'L', // 'L'
+ 'M', // 'M'
+ 'N', // 'N'
+ 'O', // 'O'
+ 'P', // 'P'
+ 'Q', // 'Q'
+ 'R', // 'R'
+ 'S', // 'S'
+ 'T', // 'T'
+ 'U', // 'U'
+ 'V', // 'V'
+ 'W', // 'W'
+ 'X', // 'X'
+ 'Y', // 'Y'
+ 'Z', // 'Z'
+ '[', // '['
+ '\', // '\'
+ ']', // ']'
+ '^', // '^'
+ '_', // '_'
+ '`', // '`'
+ 'a', // 'a'
+ 'b', // 'b'
+ 'c', // 'c'
+ 'd', // 'd'
+ 'e', // 'e'
+ 'f', // 'f'
+ 'g', // 'g'
+ 'h', // 'h'
+ 'i', // 'i'
+ 'j', // 'j'
+ 'k', // 'k'
+ 'l', // 'l'
+ 'm', // 'm'
+ 'n', // 'n'
+ 'o', // 'o'
+ 'p', // 'p'
+ 'q', // 'q'
+ 'r', // 'r'
+ 's', // 's'
+ 't', // 't'
+ 'u', // 'u'
+ 'v', // 'v'
+ 'w', // 'w'
+ 'x', // 'x'
+ 'y', // 'y'
+ 'z', // 'z'
+ '{', // '{'
+ '|', // '|'
+ '}', // '}'
+ '~', // '~'
+ #127, // #127
+ #195#135, // #128
+ #195#188, // #129
+ #195#169, // #130
+ #195#162, // #131
+ #195#164, // #132
+ #195#160, // #133
+ #195#165, // #134
+ #195#167, // #135
+ #195#170, // #136
+ #195#171, // #137
+ #195#168, // #138
+ #195#175, // #139
+ #195#174, // #140
+ #195#172, // #141
+ #195#132, // #142
+ #195#133, // #143
+ #195#137, // #144
+ #195#166, // #145
+ #195#134, // #146
+ #195#180, // #147
+ #195#182, // #148
+ #195#178, // #149
+ #195#187, // #150
+ #195#185, // #151
+ #195#191, // #152
+ #195#150, // #153
+ #195#156, // #154
+ #195#184, // #155
+ #194#163, // #156
+ #195#152, // #157
+ #195#151, // #158
+ #198#146, // #159
+ #195#161, // #160
+ #195#173, // #161
+ #195#179, // #162
+ #195#186, // #163
+ #195#177, // #164
+ #195#145, // #165
+ #194#170, // #166
+ #194#186, // #167
+ #194#191, // #168
+ #194#174, // #169
+ #194#172, // #170
+ #194#189, // #171
+ #194#188, // #172
+ #194#161, // #173
+ #194#171, // #174
+ #194#187, // #175
+ #226#150#145, // #176
+ #226#150#146, // #177
+ #226#150#147, // #178
+ #226#148#130, // #179
+ #226#148#164, // #180
+ #195#129, // #181
+ #195#130, // #182
+ #195#128, // #183
+ #194#169, // #184
+ #226#149#163, // #185
+ #226#149#145, // #186
+ #226#149#151, // #187
+ #226#149#157, // #188
+ #194#162, // #189
+ #194#165, // #190
+ #226#148#144, // #191
+ #226#148#148, // #192
+ #226#148#180, // #193
+ #226#148#172, // #194
+ #226#148#156, // #195
+ #226#148#128, // #196
+ #226#148#188, // #197
+ #195#163, // #198
+ #195#131, // #199
+ #226#149#154, // #200
+ #226#149#148, // #201
+ #226#149#169, // #202
+ #226#149#166, // #203
+ #226#149#160, // #204
+ #226#149#144, // #205
+ #226#149#172, // #206
+ #194#164, // #207
+ #195#176, // #208
+ #195#144, // #209
+ #195#138, // #210
+ #195#139, // #211
+ #195#136, // #212
+ #196#177, // #213
+ #195#141, // #214
+ #195#142, // #215
+ #195#143, // #216
+ #226#148#152, // #217
+ #226#148#140, // #218
+ #226#150#136, // #219
+ #226#150#132, // #220
+ #194#166, // #221
+ #195#140, // #222
+ #226#150#128, // #223
+ #195#147, // #224
+ #195#159, // #225
+ #195#148, // #226
+ #195#146, // #227
+ #195#181, // #228
+ #195#149, // #229
+ #194#181, // #230
+ #195#190, // #231
+ #195#158, // #232
+ #195#154, // #233
+ #195#155, // #234
+ #195#153, // #235
+ #195#189, // #236
+ #195#157, // #237
+ #194#175, // #238
+ #194#180, // #239
+ #194#173, // #240
+ #194#177, // #241
+ #226#128#151, // #242
+ #194#190, // #243
+ #194#182, // #244
+ #194#167, // #245
+ #195#183, // #246
+ #194#184, // #247
+ #194#176, // #248
+ #194#168, // #249
+ #194#183, // #250
+ #194#185, // #251
+ #194#179, // #252
+ #194#178, // #253
+ #226#150#160, // #254
+ #194#160 // #255
+ );
+
+
+
+ ArrayIBMGraphToUTF8: TCharToUTF8Table = (
+ #0, // #0
+ #1, // #1
+ #2, // #2
+ #3, // #3
+ #4, // #4
+ #5, // #5
+ #6, // #6
+ #$E2#$80#$A2, // #7 bullet
+ #8, // #8
+ #9, // #9
+ #10, // #10
+ #11, // #11
+ #12, // #12
+ #13, // #13
+ #14, // #14
+ #15, // #15
+ #16, // #16
+ #$E2#$86#$90, // #17
+ #18, // #18
+ #19, // #19
+ #20, // #20
+ #21, // #21
+ #22, // #22
+ #23, // #23
+ #$E2#$86#$91, // #24 up arrow
+ #$E2#$86#$93, // #25 down arrow
+ #$E2#$86#$92, // #26 right arrow
+ #$E2#$86#$90, // #27 left arrow
+ #28, // #28
+ #29, // #29 left arrow
+ #30, // #30
+ #31, // #31
+ ' ', // ' '
+ '!', // '!'
+ '"', // '"'
+ '#', // '#'
+ '$', // '$'
+ '%', // '%'
+ '&', // '&'
+ '''', // ''''
+ '(', // '('
+ ')', // ')'
+ '*', // '*'
+ '+', // '+'
+ ',', // ','
+ '-', // '-'
+ '.', // '.'
+ '/', // '/'
+ '0', // '0'
+ '1', // '1'
+ '2', // '2'
+ '3', // '3'
+ '4', // '4'
+ '5', // '5'
+ '6', // '6'
+ '7', // '7'
+ '8', // '8'
+ '9', // '9'
+ ':', // ':'
+ ';', // ';'
+ '<', // '<'
+ '=', // '='
+ '>', // '>'
+ '?', // '?'
+ '@', // '@'
+ 'A', // 'A'
+ 'B', // 'B'
+ 'C', // 'C'
+ 'D', // 'D'
+ 'E', // 'E'
+ 'F', // 'F'
+ 'G', // 'G'
+ 'H', // 'H'
+ 'I', // 'I'
+ 'J', // 'J'
+ 'K', // 'K'
+ 'L', // 'L'
+ 'M', // 'M'
+ 'N', // 'N'
+ 'O', // 'O'
+ 'P', // 'P'
+ 'Q', // 'Q'
+ 'R', // 'R'
+ 'S', // 'S'
+ 'T', // 'T'
+ 'U', // 'U'
+ 'V', // 'V'
+ 'W', // 'W'
+ 'X', // 'X'
+ 'Y', // 'Y'
+ 'Z', // 'Z'
+ '[', // '['
+ '\', // '\'
+ ']', // ']'
+ '^', // '^'
+ '_', // '_'
+ '`', // '`'
+ 'a', // 'a'
+ 'b', // 'b'
+ 'c', // 'c'
+ 'd', // 'd'
+ 'e', // 'e'
+ 'f', // 'f'
+ 'g', // 'g'
+ 'h', // 'h'
+ 'i', // 'i'
+ 'j', // 'j'
+ 'k', // 'k'
+ 'l', // 'l'
+ 'm', // 'm'
+ 'n', // 'n'
+ 'o', // 'o'
+ 'p', // 'p'
+ 'q', // 'q'
+ 'r', // 'r'
+ 's', // 's'
+ 't', // 't'
+ 'u', // 'u'
+ 'v', // 'v'
+ 'w', // 'w'
+ 'x', // 'x'
+ 'y', // 'y'
+ 'z', // 'z'
+ '{', // '{'
+ '|', // '|'
+ '}', // '}'
+ '~', // '~'
+ #127, // #127
+ #195#135, // #128
+ #195#188, // #129
+ #195#169, // #130
+ #195#162, // #131
+ #195#164, // #132
+ #195#160, // #133
+ #195#165, // #134
+ #195#167, // #135
+ #195#170, // #136
+ #195#171, // #137
+ #195#168, // #138
+ #195#175, // #139
+ #195#174, // #140
+ #195#172, // #141
+ #195#132, // #142
+ #195#133, // #143
+ #195#137, // #144
+ #195#166, // #145
+ #195#134, // #146
+ #195#180, // #147
+ #195#182, // #148
+ #195#178, // #149
+ #195#187, // #150
+ #195#185, // #151
+ #195#191, // #152
+ #195#150, // #153
+ #195#156, // #154
+ #194#162, // #155
+ #194#163, // #156
+ #194#165, // #157
+ #226#130#167, // #158
+ #198#146, // #159
+ #195#161, // #160
+ #195#173, // #161
+ #195#179, // #162
+ #195#186, // #163
+ #195#177, // #164
+ #195#145, // #165
+ #194#170, // #166
+ #194#186, // #167
+ #194#191, // #168
+ #226#140#144, // #169
+ #194#172, // #170
+ #194#189, // #171
+ #194#188, // #172
+ #194#161, // #173
+ #194#171, // #174
+ #194#187, // #175
+ #226#150#145, // #176
+ #226#150#146, // #177
+ #226#150#147, // #178
+ #226#148#130, // #179
+ #226#148#164, // #180
+ #226#149#161, // #181
+ #226#149#162, // #182
+ #226#149#150, // #183
+ #226#149#149, // #184
+ #226#149#163, // #185
+ #226#149#145, // #186
+ #226#149#151, // #187
+ #226#149#157, // #188
+ #226#149#156, // #189
+ #226#149#155, // #190
+ #226#148#144, // #191
+ #226#148#148, // #192
+ #226#148#180, // #193
+ #226#148#172, // #194
+ #226#148#156, // #195
+ #226#148#128, // #196
+ #226#148#188, // #197
+ #226#149#158, // #198
+ #226#149#159, // #199
+ #226#149#154, // #200
+ #226#149#148, // #201
+ #226#149#169, // #202
+ #226#149#166, // #203
+ #226#149#160, // #204
+ #226#149#144, // #205
+ #226#149#172, // #206
+ #226#149#167, // #207
+ #226#149#168, // #208
+ #226#149#164, // #209
+ #226#149#165, // #210
+ #226#149#153, // #211
+ #226#149#152, // #212
+ #226#149#146, // #213
+ #226#149#147, // #214
+ #226#149#171, // #215
+ #226#149#170, // #216
+ #226#148#152, // #217
+ #226#148#140, // #218
+ #226#150#136, // #219
+ #226#150#132, // #220
+ #226#150#140, // #221
+ #226#150#144, // #222
+ #226#150#128, // #223
+ #206#177, // #224
+ #195#159, // #225
+ #206#147, // #226
+ #207#128, // #227
+ #206#163, // #228
+ #207#131, // #229
+ #194#181, // #230
+ #207#132, // #231
+ #206#166, // #232
+ #206#152, // #233
+ #206#169, // #234
+ #206#180, // #235
+ #226#136#158, // #236
+ #207#134, // #237
+ #206#181, // #238
+ #226#136#169, // #239
+ #226#137#161, // #240
+ #194#177, // #241
+ #226#137#165, // #242
+ #226#137#164, // #243
+ #226#140#160, // #244
+ #226#140#161, // #245
+ #195#183, // #246
+ #226#137#136, // #247
+ #194#176, // #248
+ #226#136#153, // #249
+ #194#183, // #250
+ #226#136#154, // #251
+ #226#129#191, // #252
+ #194#178, // #253
+ #226#150#160, // #254
+ #194#160 // #255
+ );
+
+ ArrayIPFToUTF8 : TCharToUTF8Table = (
+ #0, // #0
+ #1, // #1
+ #2, // #2
+ #3, // #3
+ #4, // #4
+ #5, // #5
+ #6, // #6
+ #$E2#$80#$A2, // #7 bullet (hard-coded in IPF Compiler)
+ #8, // #8
+ #9, // #9
+ #10, // #10
+ #$E2#$97#$84, // #11
+ #12, // #12
+ #13, // #13
+ #14, // #14
+ #15, // #15
+ '>', // #16
+ '<', // #17
+ #18, // #18
+ #19, // #19
+ #20, // #20
+ #21, // #21
+ #22, // #22
+ #23, // #23
+ #24, // #24 up arrow
+ #25, // #25 down arrow
+ #26, // #26 right arrow
+ #27, // #27 left arrow
+ #28, // #28
+ #29, // #29
+ #30, // #30
+ #31, // #31
+ ' ', // ' '
+ '!', // '!'
+ '"', // '"'
+ '#', // '#'
+ '$', // '$'
+ '%', // '%'
+ '&', // '&'
+ '''', // ''''
+ '(', // '('
+ ')', // ')'
+ '*', // '*'
+ '+', // '+'
+ ',', // ','
+ '-', // '-'
+ '.', // '.'
+ '/', // '/'
+ '0', // '0'
+ '1', // '1'
+ '2', // '2'
+ '3', // '3'
+ '4', // '4'
+ '5', // '5'
+ '6', // '6'
+ '7', // '7'
+ '8', // '8'
+ '9', // '9'
+ ':', // ':'
+ ';', // ';'
+ '<', // '<'
+ '=', // '='
+ '>', // '>'
+ '?', // '?'
+ '@', // '@'
+ 'A', // 'A'
+ 'B', // 'B'
+ 'C', // 'C'
+ 'D', // 'D'
+ 'E', // 'E'
+ 'F', // 'F'
+ 'G', // 'G'
+ 'H', // 'H'
+ 'I', // 'I'
+ 'J', // 'J'
+ 'K', // 'K'
+ 'L', // 'L'
+ 'M', // 'M'
+ 'N', // 'N'
+ 'O', // 'O'
+ 'P', // 'P'
+ 'Q', // 'Q'
+ 'R', // 'R'
+ 'S', // 'S'
+ 'T', // 'T'
+ 'U', // 'U'
+ 'V', // 'V'
+ 'W', // 'W'
+ 'X', // 'X'
+ 'Y', // 'Y'
+ 'Z', // 'Z'
+ '[', // '['
+ '\', // '\'
+ ']', // ']'
+ '^', // '^'
+ '_', // '_'
+ '`', // '`'
+ 'a', // 'a'
+ 'b', // 'b'
+ 'c', // 'c'
+ 'd', // 'd'
+ 'e', // 'e'
+ 'f', // 'f'
+ 'g', // 'g'
+ 'h', // 'h'
+ 'i', // 'i'
+ 'j', // 'j'
+ 'k', // 'k'
+ 'l', // 'l'
+ 'm', // 'm'
+ 'n', // 'n'
+ 'o', // 'o'
+ 'p', // 'p'
+ 'q', // 'q'
+ 'r', // 'r'
+ 's', // 's'
+ 't', // 't'
+ 'u', // 'u'
+ 'v', // 'v'
+ 'w', // 'w'
+ 'x', // 'x'
+ 'y', // 'y'
+ 'z', // 'z'
+ '{', // '{'
+ '|', // '|'
+ '}', // '}'
+ '~', // '~'
+ #$E2#$8C#$82, // #127 house
+ #128, // #195#135
+ #129, // #195#188
+ #130, // #195#169
+ #131, // #195#162
+ #132, // #195#164
+ #133, // #195#160
+ #134, // #195#165
+ #135, // #195#167
+ #136, // #195#170
+ #137, // #195#171
+ #138, // #195#168
+ #139, // #195#175
+ #140, // #195#174
+ #141, // #195#172
+ #142, // #195#132
+ #143, // #195#133
+ #144, // #195#137
+ #145, // #195#166
+ #146, // #195#134
+ #147, // #195#180
+ #148, // #195#182
+ #149, // #195#178
+ #150, // #195#187
+ #151, // #195#185
+ #152, // #195#191
+ #153, // #195#150
+ #154, // #195#156
+ #155, // #194#162
+ #156, // #194#163
+ #157, // #194#165
+ #158, // #226#130#167
+ #159, // #198#146
+ #160, // #195#161
+ #161, // #195#173
+ #162, // #195#179
+ #163, // #195#186
+ #164, // #195#177
+ #165, // #195#145
+ #166, // #194#170
+ #167, // #194#186
+ #168, // #194#191
+ #169, // #226#140#144
+ #170, // #194#172
+ #171, // #194#189
+ #172, // #194#188
+ #173, // #194#161
+ #174, // #194#171
+ #175, // #194#187
+ #176, // #226#150#145
+ #177, // #226#150#146
+ #178, // #226#150#147
+ #179, // #226#148#130
+ #180, // #226#148#164
+ #181, // #226#149#161
+ #182, // #226#149#162
+ #183, // #226#149#150
+ #184, // #226#149#149
+ #185, // #226#149#163
+ #186, // #226#149#145
+ #187, // #226#149#151
+ #188, // #226#149#157
+ #189, // #226#149#156
+ #190, // #226#149#155
+ #191, // #226#148#144
+ #192, // #226#148#148
+ #193, // #226#148#180
+ #$E2#$94#$AC, // #226#148#172
+ #195, // #226#148#156
+ #$E2#$94#$80, // #196
+ #197, // #226#148#188
+ #198, // #226#149#158
+ #199, // #226#149#159
+ #200, // #226#149#154
+ #201, // #226#149#148
+ #202, // #226#149#169
+ #203, // #226#149#166
+ #204, // #226#149#160
+ #205, // #226#149#144
+ #206, // #226#149#172
+ #207, // #226#149#167
+ #208, // #226#149#168
+ #209, // #226#149#164
+ #210, // #226#149#165
+ #211, // #226#149#153
+ #212, // #226#149#152
+ #213, // #226#149#146
+ #214, // #226#149#147
+ #215, // #226#149#171
+ #216, // #226#149#170
+ #217, // #226#148#152
+ #218, // #226#148#140
+ #219, // #226#150#136
+ #220, // #226#150#132
+ #221, // #226#150#140
+ #222, // #226#150#144
+ #223, // #226#150#128
+ #224, // #206#177
+ #225, // #195#159
+ #226, // #206#147
+ #227, // #207#128
+ #228, // #206#163
+ #229, // #207#131
+ #230, // #194#181
+ #231, // #207#132
+ #232, // #206#166
+ #233, // #206#152
+ #234, // #206#169
+ #235, // #206#180
+ #236, // #226#136#158
+ #237, // #207#134
+ #238, // #206#181
+ #239, // #226#136#169
+ #240, // #226#137#161
+ #241, // #194#177
+ #242, // #226#137#165
+ #243, // #226#137#164
+ #244, // #226#140#160
+ #245, // #226#140#161
+ #246, // #195#183
+ #247, // #226#137#136
+ #248, // #194#176
+ #249, // #226#136#153
+ #250, // #194#183
+ #251, // #226#136#154
+ #252, // #226#129#191
+ #253, // #194#178
+ #254, // #226#150#160
+ #255 // #194#160
+ );
+
+
+function CP437ToUTF8(const s: string): TfpgString;
+begin
+ Result := SingleByteToUTF8(s, ArrayCP437ToUTF8);
+end;
+
+function CP850ToUTF8(const s: string): TfpgString;
+begin
+ Result := SingleByteToUTF8(s, ArrayCP850ToUTF8);
+end;
+
+function IBMGraphToUTF8(const s: string): TfpgString;
+begin
+ Result := SingleByteToUTF8(s, ArrayIBMGraphToUTF8);
+end;
+
+function IPFToUTF8(const s: string): TfpgString;
+ // Seaches <AValue> and replaces <ADel> with <AIns>. Case sensitive.
+ function tiStrTran(AValue, ADel, AIns : string): string;
+ var
+ i : integer;
+ sToChange : string;
+ begin
+ result := '';
+ sToChange := AValue;
+ i := UTF8Pos(ADel, sToChange);
+ while i <> 0 do
+ begin
+ result := result + UTF8Copy(sToChange, 1, i-1) + AIns;
+ UTF8Delete(sToChange, 1, i+UTF8length(ADel)-1);
+ i := UTF8Pos(ADel, sToChange);
+ end;
+ result := result + sToChange;
+ end;
+
+begin
+ // IBM Graph CodePage 437 (kind-of) to Unicode mapping.
+ // Below is what we had before this function
+ Result := SingleByteToUTF8(s, ArrayIPFToUTF8);
+ //Result := s;
+ //Result := StringReplace(Result, Chr($07), #$E2#$80#$A2, [rfReplaceAll, rfIgnoreCase]); // u+2022 small bullet
+ //Result := tiStrTran(Result, Char(16), '>' );
+ //Result := tiStrTran(Result, Char(17), '<' );
+ //Result := tiStrTran(Result, Char($1f), '▼' );
+ //Result := tiStrTran(Result, Char(179), '│' );
+ //Result := tiStrTran(Result, Char(180), '┤' );
+ //Result := tiStrTran(Result, Char(191), '┐' );
+ //Result := tiStrTran(Result, Char(192), '└' );
+ //Result := tiStrTran(Result, Char(193), '┴' );
+ //Result := tiStrTran(Result, Char(194), '┬' );
+ //Result := tiStrTran(Result, Char(195), '├' );
+ //Result := tiStrTran(Result, Char(196), '─' );
+ //Result := tiStrTran(Result, Char(197), '┼' );
+ //Result := tiStrTran(Result, Char(217), '┘' );
+ //Result := tiStrTran(Result, Char(218), '┌' );
+end;
+
+function SingleByteToUTF8(const s: string; const Table: TCharToUTF8Table): TfpgString;
+var
+ len: Integer;
+ i: Integer;
+ Src: PChar;
+ Dest: PChar;
+ p: PChar;
+ c: Char;
+begin
+ if s='' then
+ begin
+ Result := s;
+ exit;
+ end;
+ len := length(s);
+ SetLength(Result, len*4); // UTF-8 is at most 4 bytes
+ Src := PChar(s);
+ Dest := PChar(Result);
+ for i := 1 to len do
+ begin
+ c := Src^;
+ inc(Src);
+ //if ord(c) < 128 then
+ //begin
+ // Dest^ := c;
+ // inc(Dest);
+ //end
+ //else
+ begin
+ p := Table[c];
+ if p <> nil then
+ begin
+ while p^ <> #0 do
+ begin
+ Dest^ := p^;
+ inc(p);
+ inc(Dest);
+ end;
+ end;
+ end;
+ end;
+ SetLength(Result, PtrUInt(Dest)-PtrUInt(Result));
+end;
+
end.