line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
# Device::Gsm::Charset - GSM0338 <=> ASCII charset conversion module |
2
|
|
|
|
|
|
|
# Copyright (C) 2004-2009 Cosimo Streppone, cosimo@cpan.org |
3
|
|
|
|
|
|
|
# |
4
|
|
|
|
|
|
|
# This program is free software; you can redistribute it and/or modify |
5
|
|
|
|
|
|
|
# it only under the terms of Perl itself. |
6
|
|
|
|
|
|
|
# |
7
|
|
|
|
|
|
|
# This program is distributed in the hope that it will be useful, |
8
|
|
|
|
|
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
9
|
|
|
|
|
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
10
|
|
|
|
|
|
|
# Perl licensing terms for details. |
11
|
|
|
|
|
|
|
# |
12
|
|
|
|
|
|
|
# $Id$ |
13
|
|
|
|
|
|
|
|
14
|
|
|
|
|
|
|
package Device::Gsm::Charset; |
15
|
|
|
|
|
|
|
$VERSION = substr q$Revision$, 0, 10; |
16
|
|
|
|
|
|
|
|
17
|
11
|
|
|
11
|
|
26478
|
use strict; |
|
11
|
|
|
|
|
21
|
|
|
11
|
|
|
|
|
412
|
|
18
|
11
|
|
|
11
|
|
63
|
use constant NPC7 => 0x3F; |
|
11
|
|
|
|
|
22
|
|
|
11
|
|
|
|
|
1017
|
|
19
|
11
|
|
|
11
|
|
65
|
use constant NPC8 => 0x3F; |
|
11
|
|
|
|
|
22
|
|
|
11
|
|
|
|
|
688
|
|
20
|
11
|
|
|
11
|
|
64
|
use constant ESCAPE => 0x1B; |
|
11
|
|
|
|
|
18
|
|
|
11
|
|
|
|
|
21462
|
|
21
|
|
|
|
|
|
|
|
22
|
|
|
|
|
|
|
# The following is the GSM 3.38 standard charset, as shown |
23
|
|
|
|
|
|
|
# on some Siemens documentation found on the internet |
24
|
|
|
|
|
|
|
|
25
|
|
|
|
|
|
|
#my $gsm_charset = join('', |
26
|
|
|
|
|
|
|
# '@»$»»»»»»»'."\n".'»»'."\r".'»»»', # 16 |
27
|
|
|
|
|
|
|
# '»»»»»»»»»»»»ß»»', |
28
|
|
|
|
|
|
|
# ' !"# %&‘()*+,-./', |
29
|
|
|
|
|
|
|
# '0123456789:;<=>?', |
30
|
|
|
|
|
|
|
# '-ABCDEFGHIJKLMNO', |
31
|
|
|
|
|
|
|
# 'PQRSTUVWXYZÄֻܻ', |
32
|
|
|
|
|
|
|
# '¨abcdefghijklmno', |
33
|
|
|
|
|
|
|
# 'pqrstuvwxyzäö»ü»' |
34
|
|
|
|
|
|
|
#); |
35
|
|
|
|
|
|
|
|
36
|
|
|
|
|
|
|
# |
37
|
|
|
|
|
|
|
# These conversion tables are taken from pduconv 0.1 library |
38
|
|
|
|
|
|
|
# by Mats Engstrom . See also: |
39
|
|
|
|
|
|
|
# http://freshmeat.net/projects/pduconv |
40
|
|
|
|
|
|
|
# |
41
|
|
|
|
|
|
|
# Un grazie a Stefano! |
42
|
|
|
|
|
|
|
# |
43
|
|
|
|
|
|
|
|
44
|
|
|
|
|
|
|
@Device::Gsm::Charset::GSM0338_TO_ISO8859 = ( |
45
|
|
|
|
|
|
|
64, # 0 @ COMMERCIAL AT */ |
46
|
|
|
|
|
|
|
163, # 1 £ POUND SIGN */ |
47
|
|
|
|
|
|
|
36, # 2 $ DOLLAR SIGN */ |
48
|
|
|
|
|
|
|
165, # 3 ¥ YEN SIGN */ |
49
|
|
|
|
|
|
|
232, # 4 è LATIN SMALL LETTER E WITH GRAVE */ |
50
|
|
|
|
|
|
|
233, # 5 é LATIN SMALL LETTER E WITH ACUTE */ |
51
|
|
|
|
|
|
|
249, # 6 ù LATIN SMALL LETTER U WITH GRAVE */ |
52
|
|
|
|
|
|
|
236, # 7 ì LATIN SMALL LETTER I WITH GRAVE */ |
53
|
|
|
|
|
|
|
242, # 8 ò LATIN SMALL LETTER O WITH GRAVE */ |
54
|
|
|
|
|
|
|
199, # 9 Ç LATIN CAPITAL LETTER C WITH CEDILLA */ |
55
|
|
|
|
|
|
|
10, # 10 LINE FEED */ |
56
|
|
|
|
|
|
|
216, # 11 Ø LATIN CAPITAL LETTER O WITH STROKE */ |
57
|
|
|
|
|
|
|
248, # 12 ø LATIN SMALL LETTER O WITH STROKE */ |
58
|
|
|
|
|
|
|
13, # 13 CARRIAGE RETURN */ |
59
|
|
|
|
|
|
|
197, # 14 Å LATIN CAPITAL LETTER A WITH RING ABOVE */ |
60
|
|
|
|
|
|
|
229, # 15 å LATIN SMALL LETTER A WITH RING ABOVE */ |
61
|
|
|
|
|
|
|
NPC8, # 16 GREEK CAPITAL LETTER DELTA */ |
62
|
|
|
|
|
|
|
95, # 17 _ LOW LINE */ |
63
|
|
|
|
|
|
|
NPC8, # 18 GREEK CAPITAL LETTER PHI */ |
64
|
|
|
|
|
|
|
NPC8, # 19 GREEK CAPITAL LETTER GAMMA */ |
65
|
|
|
|
|
|
|
NPC8, # 20 GREEK CAPITAL LETTER LAMBDA */ |
66
|
|
|
|
|
|
|
NPC8, # 21 GREEK CAPITAL LETTER OMEGA */ |
67
|
|
|
|
|
|
|
NPC8, # 22 GREEK CAPITAL LETTER PI */ |
68
|
|
|
|
|
|
|
NPC8, # 23 GREEK CAPITAL LETTER PSI */ |
69
|
|
|
|
|
|
|
NPC8, # 24 GREEK CAPITAL LETTER SIGMA */ |
70
|
|
|
|
|
|
|
NPC8, # 25 GREEK CAPITAL LETTER THETA */ |
71
|
|
|
|
|
|
|
NPC8, # 26 GREEK CAPITAL LETTER XI */ |
72
|
|
|
|
|
|
|
27, # 27 ESCAPE TO EXTENSION TABLE */ |
73
|
|
|
|
|
|
|
198, # 28 Æ LATIN CAPITAL LETTER AE */ |
74
|
|
|
|
|
|
|
230, # 29 æ LATIN SMALL LETTER AE */ |
75
|
|
|
|
|
|
|
223, # 30 ß LATIN SMALL LETTER SHARP S (German) */ |
76
|
|
|
|
|
|
|
201, # 31 É LATIN CAPITAL LETTER E WITH ACUTE */ |
77
|
|
|
|
|
|
|
32, # 32 SPACE */ |
78
|
|
|
|
|
|
|
33, # 33 ! EXCLAMATION MARK */ |
79
|
|
|
|
|
|
|
34, # 34 " QUOTATION MARK */ |
80
|
|
|
|
|
|
|
35, # 35 # NUMBER SIGN */ |
81
|
|
|
|
|
|
|
164, # 36 ¤ CURRENCY SIGN */ |
82
|
|
|
|
|
|
|
37, # 37 % PERCENT SIGN */ |
83
|
|
|
|
|
|
|
38, # 38 & AMPERSAND */ |
84
|
|
|
|
|
|
|
39, # 39 ' APOSTROPHE */ |
85
|
|
|
|
|
|
|
40, # 40 ( LEFT PARENTHESIS */ |
86
|
|
|
|
|
|
|
41, # 41 ) RIGHT PARENTHESIS */ |
87
|
|
|
|
|
|
|
42, # 42 * ASTERISK */ |
88
|
|
|
|
|
|
|
43, # 43 + PLUS SIGN */ |
89
|
|
|
|
|
|
|
44, # 44 , COMMA */ |
90
|
|
|
|
|
|
|
45, # 45 - HYPHEN-MINUS */ |
91
|
|
|
|
|
|
|
46, # 46 . FULL STOP */ |
92
|
|
|
|
|
|
|
47, # 47 / SOLIDUS (SLASH) */ |
93
|
|
|
|
|
|
|
48, # 48 0 DIGIT ZERO */ |
94
|
|
|
|
|
|
|
49, # 49 1 DIGIT ONE */ |
95
|
|
|
|
|
|
|
50, # 50 2 DIGIT TWO */ |
96
|
|
|
|
|
|
|
51, # 51 3 DIGIT THREE */ |
97
|
|
|
|
|
|
|
52, # 52 4 DIGIT FOUR */ |
98
|
|
|
|
|
|
|
53, # 53 5 DIGIT FIVE */ |
99
|
|
|
|
|
|
|
54, # 54 6 DIGIT SIX */ |
100
|
|
|
|
|
|
|
55, # 55 7 DIGIT SEVEN */ |
101
|
|
|
|
|
|
|
56, # 56 8 DIGIT EIGHT */ |
102
|
|
|
|
|
|
|
57, # 57 9 DIGIT NINE */ |
103
|
|
|
|
|
|
|
58, # 58 : COLON */ |
104
|
|
|
|
|
|
|
59, # 59 ; SEMICOLON */ |
105
|
|
|
|
|
|
|
60, # 60 < LESS-THAN SIGN */ |
106
|
|
|
|
|
|
|
61, # 61 = EQUALS SIGN */ |
107
|
|
|
|
|
|
|
62, # 62 > GREATER-THAN SIGN */ |
108
|
|
|
|
|
|
|
63, # 63 ? QUESTION MARK */ |
109
|
|
|
|
|
|
|
161, # 64 ¡ INVERTED EXCLAMATION MARK */ |
110
|
|
|
|
|
|
|
65, # 65 A LATIN CAPITAL LETTER A */ |
111
|
|
|
|
|
|
|
66, # 66 B LATIN CAPITAL LETTER B */ |
112
|
|
|
|
|
|
|
67, # 67 C LATIN CAPITAL LETTER C */ |
113
|
|
|
|
|
|
|
68, # 68 D LATIN CAPITAL LETTER D */ |
114
|
|
|
|
|
|
|
69, # 69 E LATIN CAPITAL LETTER E */ |
115
|
|
|
|
|
|
|
70, # 70 F LATIN CAPITAL LETTER F */ |
116
|
|
|
|
|
|
|
71, # 71 G LATIN CAPITAL LETTER G */ |
117
|
|
|
|
|
|
|
72, # 72 H LATIN CAPITAL LETTER H */ |
118
|
|
|
|
|
|
|
73, # 73 I LATIN CAPITAL LETTER I */ |
119
|
|
|
|
|
|
|
74, # 74 J LATIN CAPITAL LETTER J */ |
120
|
|
|
|
|
|
|
75, # 75 K LATIN CAPITAL LETTER K */ |
121
|
|
|
|
|
|
|
76, # 76 L LATIN CAPITAL LETTER L */ |
122
|
|
|
|
|
|
|
77, # 77 M LATIN CAPITAL LETTER M */ |
123
|
|
|
|
|
|
|
78, # 78 N LATIN CAPITAL LETTER N */ |
124
|
|
|
|
|
|
|
79, # 79 O LATIN CAPITAL LETTER O */ |
125
|
|
|
|
|
|
|
80, # 80 P LATIN CAPITAL LETTER P */ |
126
|
|
|
|
|
|
|
81, # 81 Q LATIN CAPITAL LETTER Q */ |
127
|
|
|
|
|
|
|
82, # 82 R LATIN CAPITAL LETTER R */ |
128
|
|
|
|
|
|
|
83, # 83 S LATIN CAPITAL LETTER S */ |
129
|
|
|
|
|
|
|
84, # 84 T LATIN CAPITAL LETTER T */ |
130
|
|
|
|
|
|
|
85, # 85 U LATIN CAPITAL LETTER U */ |
131
|
|
|
|
|
|
|
86, # 86 V LATIN CAPITAL LETTER V */ |
132
|
|
|
|
|
|
|
87, # 87 W LATIN CAPITAL LETTER W */ |
133
|
|
|
|
|
|
|
88, # 88 X LATIN CAPITAL LETTER X */ |
134
|
|
|
|
|
|
|
89, # 89 Y LATIN CAPITAL LETTER Y */ |
135
|
|
|
|
|
|
|
90, # 90 Z LATIN CAPITAL LETTER Z */ |
136
|
|
|
|
|
|
|
196, # 91 Ä LATIN CAPITAL LETTER A WITH DIAERESIS */ |
137
|
|
|
|
|
|
|
214, # 92 Ö LATIN CAPITAL LETTER O WITH DIAERESIS */ |
138
|
|
|
|
|
|
|
209, # 93 Ñ LATIN CAPITAL LETTER N WITH TILDE */ |
139
|
|
|
|
|
|
|
220, # 94 Ü LATIN CAPITAL LETTER U WITH DIAERESIS */ |
140
|
|
|
|
|
|
|
167, # 95 § SECTION SIGN */ |
141
|
|
|
|
|
|
|
191, # 96 ¿ INVERTED QUESTION MARK */ |
142
|
|
|
|
|
|
|
97, # 97 a LATIN SMALL LETTER A */ |
143
|
|
|
|
|
|
|
98, # 98 b LATIN SMALL LETTER B */ |
144
|
|
|
|
|
|
|
99, # 99 c LATIN SMALL LETTER C */ |
145
|
|
|
|
|
|
|
100, # 100 d LATIN SMALL LETTER D */ |
146
|
|
|
|
|
|
|
101, # 101 e LATIN SMALL LETTER E */ |
147
|
|
|
|
|
|
|
102, # 102 f LATIN SMALL LETTER F */ |
148
|
|
|
|
|
|
|
103, # 103 g LATIN SMALL LETTER G */ |
149
|
|
|
|
|
|
|
104, # 104 h LATIN SMALL LETTER H */ |
150
|
|
|
|
|
|
|
105, # 105 i LATIN SMALL LETTER I */ |
151
|
|
|
|
|
|
|
106, # 106 j LATIN SMALL LETTER J */ |
152
|
|
|
|
|
|
|
107, # 107 k LATIN SMALL LETTER K */ |
153
|
|
|
|
|
|
|
108, # 108 l LATIN SMALL LETTER L */ |
154
|
|
|
|
|
|
|
109, # 109 m LATIN SMALL LETTER M */ |
155
|
|
|
|
|
|
|
110, # 110 n LATIN SMALL LETTER N */ |
156
|
|
|
|
|
|
|
111, # 111 o LATIN SMALL LETTER O */ |
157
|
|
|
|
|
|
|
112, # 112 p LATIN SMALL LETTER P */ |
158
|
|
|
|
|
|
|
113, # 113 q LATIN SMALL LETTER Q */ |
159
|
|
|
|
|
|
|
114, # 114 r LATIN SMALL LETTER R */ |
160
|
|
|
|
|
|
|
115, # 115 s LATIN SMALL LETTER S */ |
161
|
|
|
|
|
|
|
116, # 116 t LATIN SMALL LETTER T */ |
162
|
|
|
|
|
|
|
117, # 117 u LATIN SMALL LETTER U */ |
163
|
|
|
|
|
|
|
118, # 118 v LATIN SMALL LETTER V */ |
164
|
|
|
|
|
|
|
119, # 119 w LATIN SMALL LETTER W */ |
165
|
|
|
|
|
|
|
120, # 120 x LATIN SMALL LETTER X */ |
166
|
|
|
|
|
|
|
121, # 121 y LATIN SMALL LETTER Y */ |
167
|
|
|
|
|
|
|
122, # 122 z LATIN SMALL LETTER Z */ |
168
|
|
|
|
|
|
|
228, # 123 ä LATIN SMALL LETTER A WITH DIAERESIS */ |
169
|
|
|
|
|
|
|
246, # 124 ö LATIN SMALL LETTER O WITH DIAERESIS */ |
170
|
|
|
|
|
|
|
241, # 125 ñ LATIN SMALL LETTER N WITH TILDE */ |
171
|
|
|
|
|
|
|
252, # 126 ü LATIN SMALL LETTER U WITH DIAERESIS */ |
172
|
|
|
|
|
|
|
224, # 127 à LATIN SMALL LETTER A WITH GRAVE */ |
173
|
|
|
|
|
|
|
|
174
|
|
|
|
|
|
|
# 12 27 10 FORM FEED |
175
|
|
|
|
|
|
|
# 94 27 20 ^ CIRCUMFLEX ACCENT |
176
|
|
|
|
|
|
|
# 123 27 40 { LEFT CURLY BRACKET |
177
|
|
|
|
|
|
|
# 125 27 41 } RIGHT CURLY BRACKET |
178
|
|
|
|
|
|
|
# 92 27 47 \ REVERSE SOLIDUS (BACKSLASH) |
179
|
|
|
|
|
|
|
# 91 27 60 [ LEFT SQUARE BRACKET |
180
|
|
|
|
|
|
|
# 126 27 61 ~ TILDE |
181
|
|
|
|
|
|
|
# 93 27 62 ] RIGHT SQUARE BRACKET |
182
|
|
|
|
|
|
|
# 124 27 64 | VERTICAL BAR */ |
183
|
|
|
|
|
|
|
); |
184
|
|
|
|
|
|
|
|
185
|
|
|
|
|
|
|
#my $gsm_charset = join '' => map chr => @GSM0338_TO_ISO8859; |
186
|
|
|
|
|
|
|
|
187
|
|
|
|
|
|
|
@Device::Gsm::Charset::ISO8859_TO_GSM0338 = ( |
188
|
|
|
|
|
|
|
NPC7, # 0 null [NUL] */ |
189
|
|
|
|
|
|
|
NPC7, # 1 start of heading [SOH] */ |
190
|
|
|
|
|
|
|
NPC7, # 2 start of text [STX] */ |
191
|
|
|
|
|
|
|
NPC7, # 3 end of text [ETX] */ |
192
|
|
|
|
|
|
|
NPC7, # 4 end of transmission [EOT] */ |
193
|
|
|
|
|
|
|
NPC7, # 5 enquiry [ENQ] */ |
194
|
|
|
|
|
|
|
NPC7, # 6 acknowledge [ACK] */ |
195
|
|
|
|
|
|
|
NPC7, # 7 bell [BEL] */ |
196
|
|
|
|
|
|
|
NPC7, # 8 backspace [BS] */ |
197
|
|
|
|
|
|
|
NPC7, # 9 horizontal tab [HT] */ |
198
|
|
|
|
|
|
|
10, # 10 line feed [LF] */ |
199
|
|
|
|
|
|
|
NPC7, # 11 vertical tab [VT] */ |
200
|
|
|
|
|
|
|
10 + 256, # 12 form feed [FF] */ |
201
|
|
|
|
|
|
|
13, # 13 carriage return [CR] */ |
202
|
|
|
|
|
|
|
NPC7, # 14 shift out [SO] */ |
203
|
|
|
|
|
|
|
NPC7, # 15 shift in [SI] */ |
204
|
|
|
|
|
|
|
NPC7, # 16 data link escape [DLE] */ |
205
|
|
|
|
|
|
|
NPC7, # 17 device control 1 [DC1] */ |
206
|
|
|
|
|
|
|
NPC7, # 18 device control 2 [DC2] */ |
207
|
|
|
|
|
|
|
NPC7, # 19 device control 3 [DC3] */ |
208
|
|
|
|
|
|
|
NPC7, # 20 device control 4 [DC4] */ |
209
|
|
|
|
|
|
|
NPC7, # 21 negative acknowledge [NAK] */ |
210
|
|
|
|
|
|
|
NPC7, # 22 synchronous idle [SYN] */ |
211
|
|
|
|
|
|
|
NPC7, # 23 end of trans. block [ETB] */ |
212
|
|
|
|
|
|
|
NPC7, # 24 cancel [CAN] */ |
213
|
|
|
|
|
|
|
NPC7, # 25 end of medium [EM] */ |
214
|
|
|
|
|
|
|
NPC7, # 26 substitute [SUB] */ |
215
|
|
|
|
|
|
|
NPC7, # 27 escape [ESC] */ |
216
|
|
|
|
|
|
|
NPC7, # 28 file separator [FS] */ |
217
|
|
|
|
|
|
|
NPC7, # 29 group separator [GS] */ |
218
|
|
|
|
|
|
|
NPC7, # 30 record separator [RS] */ |
219
|
|
|
|
|
|
|
NPC7, # 31 unit separator [US] */ |
220
|
|
|
|
|
|
|
32, # 32 space */ |
221
|
|
|
|
|
|
|
33, # 33 ! exclamation mark */ |
222
|
|
|
|
|
|
|
34, # 34 " double quotation mark */ |
223
|
|
|
|
|
|
|
35, # 35 # number sign */ |
224
|
|
|
|
|
|
|
2, # 36 $ dollar sign */ |
225
|
|
|
|
|
|
|
37, # 37 % percent sign */ |
226
|
|
|
|
|
|
|
38, # 38 & ampersand */ |
227
|
|
|
|
|
|
|
39, # 39 ' apostrophe */ |
228
|
|
|
|
|
|
|
40, # 40 ( left parenthesis */ |
229
|
|
|
|
|
|
|
41, # 41 ) right parenthesis */ |
230
|
|
|
|
|
|
|
42, # 42 * asterisk */ |
231
|
|
|
|
|
|
|
43, # 43 + plus sign */ |
232
|
|
|
|
|
|
|
44, # 44 , comma */ |
233
|
|
|
|
|
|
|
45, # 45 - hyphen */ |
234
|
|
|
|
|
|
|
46, # 46 . period */ |
235
|
|
|
|
|
|
|
47, # 47 / slash, */ |
236
|
|
|
|
|
|
|
48, # 48 0 digit 0 */ |
237
|
|
|
|
|
|
|
49, # 49 1 digit 1 */ |
238
|
|
|
|
|
|
|
50, # 50 2 digit 2 */ |
239
|
|
|
|
|
|
|
51, # 51 3 digit 3 */ |
240
|
|
|
|
|
|
|
52, # 52 4 digit 4 */ |
241
|
|
|
|
|
|
|
53, # 53 5 digit 5 */ |
242
|
|
|
|
|
|
|
54, # 54 6 digit 6 */ |
243
|
|
|
|
|
|
|
55, # 55 7 digit 7 */ |
244
|
|
|
|
|
|
|
56, # 56 8 digit 8 */ |
245
|
|
|
|
|
|
|
57, # 57 9 digit 9 */ |
246
|
|
|
|
|
|
|
58, # 58 : colon */ |
247
|
|
|
|
|
|
|
59, # 59 ; semicolon */ |
248
|
|
|
|
|
|
|
60, # 60 < less-than sign */ |
249
|
|
|
|
|
|
|
61, # 61 = equal sign */ |
250
|
|
|
|
|
|
|
62, # 62 > greater-than sign */ |
251
|
|
|
|
|
|
|
63, # 63 ? question mark */ |
252
|
|
|
|
|
|
|
0, # 64 @ commercial at sign */ |
253
|
|
|
|
|
|
|
65, # 65 A uppercase A */ |
254
|
|
|
|
|
|
|
66, # 66 B uppercase B */ |
255
|
|
|
|
|
|
|
67, # 67 C uppercase C */ |
256
|
|
|
|
|
|
|
68, # 68 D uppercase D */ |
257
|
|
|
|
|
|
|
69, # 69 E uppercase E */ |
258
|
|
|
|
|
|
|
70, # 70 F uppercase F */ |
259
|
|
|
|
|
|
|
71, # 71 G uppercase G */ |
260
|
|
|
|
|
|
|
72, # 72 H uppercase H */ |
261
|
|
|
|
|
|
|
73, # 73 I uppercase I */ |
262
|
|
|
|
|
|
|
74, # 74 J uppercase J */ |
263
|
|
|
|
|
|
|
75, # 75 K uppercase K */ |
264
|
|
|
|
|
|
|
76, # 76 L uppercase L */ |
265
|
|
|
|
|
|
|
77, # 77 M uppercase M */ |
266
|
|
|
|
|
|
|
78, # 78 N uppercase N */ |
267
|
|
|
|
|
|
|
79, # 79 O uppercase O */ |
268
|
|
|
|
|
|
|
80, # 80 P uppercase P */ |
269
|
|
|
|
|
|
|
81, # 81 Q uppercase Q */ |
270
|
|
|
|
|
|
|
82, # 82 R uppercase R */ |
271
|
|
|
|
|
|
|
83, # 83 S uppercase S */ |
272
|
|
|
|
|
|
|
84, # 84 T uppercase T */ |
273
|
|
|
|
|
|
|
85, # 85 U uppercase U */ |
274
|
|
|
|
|
|
|
86, # 86 V uppercase V */ |
275
|
|
|
|
|
|
|
87, # 87 W uppercase W */ |
276
|
|
|
|
|
|
|
88, # 88 X uppercase X */ |
277
|
|
|
|
|
|
|
89, # 89 Y uppercase Y */ |
278
|
|
|
|
|
|
|
90, # 90 Z uppercase Z */ |
279
|
|
|
|
|
|
|
60 + 256, # 91 [ left square bracket */ |
280
|
|
|
|
|
|
|
47 + 256, # 92 \ backslash */ |
281
|
|
|
|
|
|
|
62 + 256, # 93 ] right square bracket */ |
282
|
|
|
|
|
|
|
20 + 256, # 94 ^ circumflex accent */ |
283
|
|
|
|
|
|
|
17, # 95 _ underscore */ |
284
|
|
|
|
|
|
|
-39, # 96 ` back apostrophe */ |
285
|
|
|
|
|
|
|
97, # 97 a lowercase a */ |
286
|
|
|
|
|
|
|
98, # 98 b lowercase b */ |
287
|
|
|
|
|
|
|
99, # 99 c lowercase c */ |
288
|
|
|
|
|
|
|
100, # 100 d lowercase d */ |
289
|
|
|
|
|
|
|
101, # 101 e lowercase e */ |
290
|
|
|
|
|
|
|
102, # 102 f lowercase f */ |
291
|
|
|
|
|
|
|
103, # 103 g lowercase g */ |
292
|
|
|
|
|
|
|
104, # 104 h lowercase h */ |
293
|
|
|
|
|
|
|
105, # 105 i lowercase i */ |
294
|
|
|
|
|
|
|
106, # 106 j lowercase j */ |
295
|
|
|
|
|
|
|
107, # 107 k lowercase k */ |
296
|
|
|
|
|
|
|
108, # 108 l lowercase l */ |
297
|
|
|
|
|
|
|
109, # 109 m lowercase m */ |
298
|
|
|
|
|
|
|
110, # 110 n lowercase n */ |
299
|
|
|
|
|
|
|
111, # 111 o lowercase o */ |
300
|
|
|
|
|
|
|
112, # 112 p lowercase p */ |
301
|
|
|
|
|
|
|
113, # 113 q lowercase q */ |
302
|
|
|
|
|
|
|
114, # 114 r lowercase r */ |
303
|
|
|
|
|
|
|
115, # 115 s lowercase s */ |
304
|
|
|
|
|
|
|
116, # 116 t lowercase t */ |
305
|
|
|
|
|
|
|
117, # 117 u lowercase u */ |
306
|
|
|
|
|
|
|
118, # 118 v lowercase v */ |
307
|
|
|
|
|
|
|
119, # 119 w lowercase w */ |
308
|
|
|
|
|
|
|
120, # 120 x lowercase x */ |
309
|
|
|
|
|
|
|
121, # 121 y lowercase y */ |
310
|
|
|
|
|
|
|
122, # 122 z lowercase z */ |
311
|
|
|
|
|
|
|
40 + 256, # 123 { left brace */ |
312
|
|
|
|
|
|
|
64 + 256, # 124 | vertical bar */ |
313
|
|
|
|
|
|
|
41 + 256, # 125 } right brace */ |
314
|
|
|
|
|
|
|
61 + 256, # 126 ~ tilde accent */ |
315
|
|
|
|
|
|
|
NPC7, # 127 delete [DEL] */ |
316
|
|
|
|
|
|
|
NPC7, # 128 */ |
317
|
|
|
|
|
|
|
NPC7, # 129 */ |
318
|
|
|
|
|
|
|
-39, # 130 low left rising single quote */ |
319
|
|
|
|
|
|
|
-102, # 131 lowercase italic f */ |
320
|
|
|
|
|
|
|
-34, # 132 low left rising double quote */ |
321
|
|
|
|
|
|
|
NPC7, # 133 low horizontal ellipsis */ |
322
|
|
|
|
|
|
|
NPC7, # 134 dagger mark */ |
323
|
|
|
|
|
|
|
NPC7, # 135 double dagger mark */ |
324
|
|
|
|
|
|
|
NPC7, # 136 letter modifying circumflex */ |
325
|
|
|
|
|
|
|
NPC7, # 137 per thousand (mille) sign */ |
326
|
|
|
|
|
|
|
-83, # 138 uppercase S caron or hacek */ |
327
|
|
|
|
|
|
|
-39, # 139 left single angle quote mark */ |
328
|
|
|
|
|
|
|
-214, # 140 uppercase OE ligature */ |
329
|
|
|
|
|
|
|
NPC7, # 141 */ |
330
|
|
|
|
|
|
|
NPC7, # 142 */ |
331
|
|
|
|
|
|
|
NPC7, # 143 */ |
332
|
|
|
|
|
|
|
NPC7, # 144 */ |
333
|
|
|
|
|
|
|
-39, # 145 left single quotation mark */ |
334
|
|
|
|
|
|
|
-39, # 146 right single quote mark */ |
335
|
|
|
|
|
|
|
-34, # 147 left double quotation mark */ |
336
|
|
|
|
|
|
|
-34, # 148 right double quote mark */ |
337
|
|
|
|
|
|
|
-42, # 149 round filled bullet */ |
338
|
|
|
|
|
|
|
-45, # 150 en dash */ |
339
|
|
|
|
|
|
|
-45, # 151 em dash */ |
340
|
|
|
|
|
|
|
-39, # 152 small spacing tilde accent */ |
341
|
|
|
|
|
|
|
NPC7, # 153 trademark sign */ |
342
|
|
|
|
|
|
|
-115, # 154 lowercase s caron or hacek */ |
343
|
|
|
|
|
|
|
-39, # 155 right single angle quote mark */ |
344
|
|
|
|
|
|
|
-111, # 156 lowercase oe ligature */ |
345
|
|
|
|
|
|
|
NPC7, # 157 */ |
346
|
|
|
|
|
|
|
NPC7, # 158 */ |
347
|
|
|
|
|
|
|
-89, # 159 uppercase Y dieresis or umlaut */ |
348
|
|
|
|
|
|
|
-32, # 160 non-breaking space */ |
349
|
|
|
|
|
|
|
64, # 161 ¡ inverted exclamation mark */ |
350
|
|
|
|
|
|
|
-99, # 162 ¢ cent sign */ |
351
|
|
|
|
|
|
|
1, # 163 £ pound sterling sign */ |
352
|
|
|
|
|
|
|
36, # 164 ¤ general currency sign */ |
353
|
|
|
|
|
|
|
3, # 165 ¥ yen sign */ |
354
|
|
|
|
|
|
|
-33, # 166 ¦ broken vertical bar */ |
355
|
|
|
|
|
|
|
95, # 167 § section sign */ |
356
|
|
|
|
|
|
|
-34, # 168 ¨ spacing dieresis or umlaut */ |
357
|
|
|
|
|
|
|
NPC7, # 169 © copyright sign */ |
358
|
|
|
|
|
|
|
NPC7, # 170 ª feminine ordinal indicator */ |
359
|
|
|
|
|
|
|
-60, # 171 « left (double) angle quote */ |
360
|
|
|
|
|
|
|
NPC7, # 172 ¬ logical not sign */ |
361
|
|
|
|
|
|
|
-45, # 173 soft hyphen */ |
362
|
|
|
|
|
|
|
NPC7, # 174 ® registered trademark sign */ |
363
|
|
|
|
|
|
|
NPC7, # 175 ¯ spacing macron (long) accent */ |
364
|
|
|
|
|
|
|
NPC7, # 176 ° degree sign */ |
365
|
|
|
|
|
|
|
NPC7, # 177 ± plus-or-minus sign */ |
366
|
|
|
|
|
|
|
-50, # 178 ² superscript 2 */ |
367
|
|
|
|
|
|
|
-51, # 179 ³ superscript 3 */ |
368
|
|
|
|
|
|
|
-39, # 180 ´ spacing acute accent */ |
369
|
|
|
|
|
|
|
-117, # 181 µ micro sign */ |
370
|
|
|
|
|
|
|
NPC7, # 182 ¶ paragraph sign, pilcrow sign */ |
371
|
|
|
|
|
|
|
NPC7, # 183 · middle dot, centered dot */ |
372
|
|
|
|
|
|
|
NPC7, # 184 ¸ spacing cedilla */ |
373
|
|
|
|
|
|
|
-49, # 185 ¹ superscript 1 */ |
374
|
|
|
|
|
|
|
NPC7, # 186 º masculine ordinal indicator */ |
375
|
|
|
|
|
|
|
-62, # 187 » right (double) angle quote (guillemet) */ |
376
|
|
|
|
|
|
|
NPC7, # 188 ¼ fraction 1/4 */ |
377
|
|
|
|
|
|
|
NPC7, # 189 ½ fraction 1/2 */ |
378
|
|
|
|
|
|
|
NPC7, # 190 ¾ fraction 3/4 */ |
379
|
|
|
|
|
|
|
96, # 191 ¿ inverted question mark */ |
380
|
|
|
|
|
|
|
-65, # 192 À uppercase A grave */ |
381
|
|
|
|
|
|
|
-65, # 193 Á uppercase A acute */ |
382
|
|
|
|
|
|
|
-65, # 194 Â uppercase A circumflex */ |
383
|
|
|
|
|
|
|
-65, # 195 Ã uppercase A tilde */ |
384
|
|
|
|
|
|
|
91, # 196 Ä uppercase A dieresis or umlaut */ |
385
|
|
|
|
|
|
|
14, # 197 Å uppercase A ring */ |
386
|
|
|
|
|
|
|
28, # 198 Æ uppercase AE ligature */ |
387
|
|
|
|
|
|
|
9, # 199 Ç uppercase C cedilla */ |
388
|
|
|
|
|
|
|
-31, # 200 È uppercase E grave */ |
389
|
|
|
|
|
|
|
31, # 201 É uppercase E acute */ |
390
|
|
|
|
|
|
|
-31, # 202 Ê uppercase E circumflex */ |
391
|
|
|
|
|
|
|
-31, # 203 Ë uppercase E dieresis or umlaut */ |
392
|
|
|
|
|
|
|
-73, # 204 Ì uppercase I grave */ |
393
|
|
|
|
|
|
|
-73, # 205 Í uppercase I acute */ |
394
|
|
|
|
|
|
|
-73, # 206 Î uppercase I circumflex */ |
395
|
|
|
|
|
|
|
-73, # 207 Ï uppercase I dieresis or umlaut */ |
396
|
|
|
|
|
|
|
-68, # 208 Ð uppercase ETH */ |
397
|
|
|
|
|
|
|
93, # 209 Ñ uppercase N tilde */ |
398
|
|
|
|
|
|
|
-79, # 210 Ò uppercase O grave */ |
399
|
|
|
|
|
|
|
-79, # 211 Ó uppercase O acute */ |
400
|
|
|
|
|
|
|
-79, # 212 Ô uppercase O circumflex */ |
401
|
|
|
|
|
|
|
-79, # 213 Õ uppercase O tilde */ |
402
|
|
|
|
|
|
|
92, # 214 Ö uppercase O dieresis or umlaut */ |
403
|
|
|
|
|
|
|
-42, # 215 × multiplication sign */ |
404
|
|
|
|
|
|
|
11, # 216 Ø uppercase O slash */ |
405
|
|
|
|
|
|
|
-85, # 217 Ù uppercase U grave */ |
406
|
|
|
|
|
|
|
-85, # 218 Ú uppercase U acute */ |
407
|
|
|
|
|
|
|
-85, # 219 Û uppercase U circumflex */ |
408
|
|
|
|
|
|
|
94, # 220 Ü uppercase U dieresis or umlaut */ |
409
|
|
|
|
|
|
|
-89, # 221 Ý uppercase Y acute */ |
410
|
|
|
|
|
|
|
NPC7, # 222 Þ uppercase THORN */ |
411
|
|
|
|
|
|
|
30, # 223 ß lowercase sharp s, sz ligature */ |
412
|
|
|
|
|
|
|
127, # 224 à lowercase a grave */ |
413
|
|
|
|
|
|
|
-97, # 225 á lowercase a acute */ |
414
|
|
|
|
|
|
|
-97, # 226 â lowercase a circumflex */ |
415
|
|
|
|
|
|
|
-97, # 227 ã lowercase a tilde */ |
416
|
|
|
|
|
|
|
123, # 228 ä lowercase a dieresis or umlaut */ |
417
|
|
|
|
|
|
|
15, # 229 å lowercase a ring */ |
418
|
|
|
|
|
|
|
29, # 230 æ lowercase ae ligature */ |
419
|
|
|
|
|
|
|
-9, # 231 ç lowercase c cedilla */ |
420
|
|
|
|
|
|
|
4, # 232 è lowercase e grave */ |
421
|
|
|
|
|
|
|
5, # 233 é lowercase e acute */ |
422
|
|
|
|
|
|
|
-101, # 234 ê lowercase e circumflex */ |
423
|
|
|
|
|
|
|
-101, # 235 ë lowercase e dieresis or umlaut */ |
424
|
|
|
|
|
|
|
7, # 236 ì lowercase i grave */ |
425
|
|
|
|
|
|
|
-7, # 237 í lowercase i acute */ |
426
|
|
|
|
|
|
|
-105, # 238 î lowercase i circumflex */ |
427
|
|
|
|
|
|
|
-105, # 239 ï lowercase i dieresis or umlaut */ |
428
|
|
|
|
|
|
|
NPC7, # 240 ð lowercase eth */ |
429
|
|
|
|
|
|
|
125, # 241 ñ lowercase n tilde */ |
430
|
|
|
|
|
|
|
8, # 242 ò lowercase o grave */ |
431
|
|
|
|
|
|
|
-111, # 243 ó lowercase o acute */ |
432
|
|
|
|
|
|
|
-111, # 244 ô lowercase o circumflex */ |
433
|
|
|
|
|
|
|
-111, # 245 õ lowercase o tilde */ |
434
|
|
|
|
|
|
|
124, # 246 ö lowercase o dieresis or umlaut */ |
435
|
|
|
|
|
|
|
-47, # 247 ÷ division sign */ |
436
|
|
|
|
|
|
|
12, # 248 ø lowercase o slash */ |
437
|
|
|
|
|
|
|
6, # 249 ù lowercase u grave */ |
438
|
|
|
|
|
|
|
-117, # 250 ú lowercase u acute */ |
439
|
|
|
|
|
|
|
-117, # 251 û lowercase u circumflex */ |
440
|
|
|
|
|
|
|
126, # 252 ü lowercase u dieresis or umlaut */ |
441
|
|
|
|
|
|
|
-121, # 253 ý lowercase y acute */ |
442
|
|
|
|
|
|
|
NPC7, # 254 þ lowercase thorn */ |
443
|
|
|
|
|
|
|
-121 # 255 ÿ lowercase y dieresis or umlaut */ |
444
|
|
|
|
|
|
|
); |
445
|
|
|
|
|
|
|
|
446
|
|
|
|
|
|
|
sub iso8859_to_gsm0338 { |
447
|
384
|
|
|
384
|
0
|
135781
|
my $ascii = shift; |
448
|
384
|
50
|
33
|
|
|
1731
|
return '' if !defined $ascii || $ascii eq ''; |
449
|
|
|
|
|
|
|
|
450
|
384
|
|
|
|
|
455
|
my $gsm = ''; |
451
|
384
|
|
|
|
|
394
|
my $n = 0; |
452
|
384
|
|
|
|
|
854
|
for (; $n < length($ascii); $n++) { |
453
|
489
|
|
|
|
|
686
|
my $ch_ascii = ord(substr($ascii, $n, 1)); |
454
|
489
|
|
|
|
|
568
|
my $ch_gsm = $Device::Gsm::Charset::ISO8859_TO_GSM0338[$ch_ascii]; |
455
|
|
|
|
|
|
|
|
456
|
|
|
|
|
|
|
# Is this a "replaced" char? |
457
|
489
|
100
|
|
|
|
938
|
if ($ch_gsm <= 0xFF) { |
458
|
480
|
|
|
|
|
535
|
$ch_gsm = abs($ch_gsm); |
459
|
|
|
|
|
|
|
} |
460
|
|
|
|
|
|
|
else { |
461
|
|
|
|
|
|
|
|
462
|
|
|
|
|
|
|
# Prepend an escape char for extended char |
463
|
9
|
|
|
|
|
11
|
$gsm .= chr(ESCAPE); |
464
|
|
|
|
|
|
|
|
465
|
|
|
|
|
|
|
# Encode extended char |
466
|
9
|
|
|
|
|
14
|
$ch_gsm -= 256; |
467
|
|
|
|
|
|
|
} |
468
|
|
|
|
|
|
|
|
469
|
|
|
|
|
|
|
#warn('char ['.$ch_ascii.'] => ['.$ch_gsm.']'); |
470
|
489
|
|
|
|
|
1603
|
$gsm .= chr($ch_gsm); |
471
|
|
|
|
|
|
|
} |
472
|
384
|
|
|
|
|
1001
|
return $gsm; |
473
|
|
|
|
|
|
|
} |
474
|
|
|
|
|
|
|
|
475
|
|
|
|
|
|
|
sub gsm0338_to_iso8859 { |
476
|
390
|
|
|
390
|
0
|
459
|
my $gsm = shift; |
477
|
390
|
50
|
33
|
|
|
1451
|
return '' if !defined $gsm || $gsm eq ''; |
478
|
|
|
|
|
|
|
|
479
|
390
|
|
|
|
|
469
|
my $ascii = ''; |
480
|
390
|
|
|
|
|
384
|
my $n = 0; |
481
|
|
|
|
|
|
|
|
482
|
390
|
|
|
|
|
787
|
for (; $n < length($gsm); $n++) { |
483
|
|
|
|
|
|
|
|
484
|
840
|
|
|
|
|
1180
|
my $c = ord(substr($gsm, $n, 1)); |
485
|
|
|
|
|
|
|
|
486
|
|
|
|
|
|
|
# Extended charset ? |
487
|
840
|
100
|
|
|
|
1328
|
if ($c == ESCAPE) { # "escape extended mode" |
488
|
9
|
|
|
|
|
10
|
$n++; |
489
|
9
|
|
|
|
|
12
|
$c = ord(substr($gsm, $n, 1)); |
490
|
9
|
100
|
|
|
|
56
|
if ($c == 0x0A) { |
|
|
100
|
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
491
|
1
|
|
|
|
|
3
|
$ascii .= chr(12); |
492
|
|
|
|
|
|
|
} |
493
|
|
|
|
|
|
|
elsif ($c == 0x14) { |
494
|
1
|
|
|
|
|
4
|
$ascii .= '^'; |
495
|
|
|
|
|
|
|
} |
496
|
|
|
|
|
|
|
elsif ($c == 0x28) { |
497
|
1
|
|
|
|
|
4
|
$ascii .= '{'; |
498
|
|
|
|
|
|
|
} |
499
|
|
|
|
|
|
|
elsif ($c == 0x29) { |
500
|
1
|
|
|
|
|
4
|
$ascii .= '}'; |
501
|
|
|
|
|
|
|
} |
502
|
|
|
|
|
|
|
elsif ($c == 0x2F) { |
503
|
1
|
|
|
|
|
4
|
$ascii .= '\\'; |
504
|
|
|
|
|
|
|
} |
505
|
|
|
|
|
|
|
elsif ($c == 0x3C) { |
506
|
1
|
|
|
|
|
4
|
$ascii .= '['; |
507
|
|
|
|
|
|
|
} |
508
|
|
|
|
|
|
|
elsif ($c == 0x3D) { |
509
|
1
|
|
|
|
|
3
|
$ascii .= '~'; |
510
|
|
|
|
|
|
|
} |
511
|
|
|
|
|
|
|
elsif ($c == 0x3E) { |
512
|
1
|
|
|
|
|
4
|
$ascii .= ']'; |
513
|
|
|
|
|
|
|
} |
514
|
|
|
|
|
|
|
elsif ($c == 0x40) { |
515
|
1
|
|
|
|
|
3
|
$ascii .= '|'; |
516
|
|
|
|
|
|
|
} |
517
|
|
|
|
|
|
|
elsif ($c == 0x65) { # 'e' |
518
|
0
|
|
|
|
|
0
|
$ascii .= chr(164) |
519
|
|
|
|
|
|
|
; # iso_8859_15 EURO SIGN or iso_8859_1 CURRENCY_SIGN |
520
|
|
|
|
|
|
|
} |
521
|
|
|
|
|
|
|
else { |
522
|
0
|
|
|
|
|
0
|
$ascii .= chr(NPC8); # Non printable |
523
|
|
|
|
|
|
|
} |
524
|
|
|
|
|
|
|
|
525
|
|
|
|
|
|
|
} |
526
|
|
|
|
|
|
|
else { |
527
|
|
|
|
|
|
|
|
528
|
|
|
|
|
|
|
# Standard GSM 3.38 encoding |
529
|
831
|
|
|
|
|
2282
|
$ascii .= chr($Device::Gsm::Charset::GSM0338_TO_ISO8859[$c]); |
530
|
|
|
|
|
|
|
} |
531
|
|
|
|
|
|
|
|
532
|
|
|
|
|
|
|
#warn('gsm char ['.$c.'] converted to ascii ['.ord(substr($ascii,-1)).']'); |
533
|
|
|
|
|
|
|
} |
534
|
|
|
|
|
|
|
|
535
|
390
|
|
|
|
|
2237
|
return $ascii; |
536
|
|
|
|
|
|
|
} |
537
|
|
|
|
|
|
|
|
538
|
|
|
|
|
|
|
sub gsm0338_length { |
539
|
0
|
|
|
0
|
0
|
|
my $ascii = shift; |
540
|
0
|
|
|
|
|
|
my $gsm0338_length = 0; |
541
|
0
|
|
|
|
|
|
my $n = 0; |
542
|
0
|
|
|
|
|
|
for (; $n < length($ascii); $n++) { |
543
|
0
|
|
|
|
|
|
my $ch_ascii = ord(substr($ascii, $n, 1)); |
544
|
0
|
|
|
|
|
|
my $ch_gsm = $Device::Gsm::Charset::ISO8859_TO_GSM0338[$ch_ascii]; |
545
|
|
|
|
|
|
|
|
546
|
|
|
|
|
|
|
# Is this a "replaced" char? |
547
|
0
|
0
|
|
|
|
|
if ($ch_gsm <= 0xFF) { |
548
|
0
|
|
|
|
|
|
$gsm0338_length++; |
549
|
|
|
|
|
|
|
} |
550
|
|
|
|
|
|
|
else { |
551
|
0
|
|
|
|
|
|
$gsm0338_length += 2; |
552
|
|
|
|
|
|
|
} |
553
|
|
|
|
|
|
|
} |
554
|
0
|
|
|
|
|
|
return $gsm0338_length; |
555
|
|
|
|
|
|
|
} |
556
|
|
|
|
|
|
|
|
557
|
|
|
|
|
|
|
sub gsm0338_split { |
558
|
0
|
|
|
0
|
0
|
|
my $ascii = shift; |
559
|
0
|
0
|
0
|
|
|
|
return '' if !defined $ascii || $ascii eq ''; |
560
|
0
|
|
|
|
|
|
my @parts; |
561
|
|
|
|
|
|
|
my $part; |
562
|
0
|
|
|
|
|
|
my $chars_count = 0; |
563
|
0
|
|
|
|
|
|
my $ascii_length = length($ascii); |
564
|
0
|
|
|
|
|
|
while ($ascii_length) { |
565
|
0
|
|
|
|
|
|
my $ch_ascii = substr($ascii, 0, 1); |
566
|
0
|
|
|
|
|
|
my $ch_gsm |
567
|
|
|
|
|
|
|
= $Device::Gsm::Charset::ISO8859_TO_GSM0338[ ord($ch_ascii) ]; |
568
|
0
|
0
|
0
|
|
|
|
if ($chars_count < 153 and $ch_gsm <= 0xFF) { |
|
|
0
|
0
|
|
|
|
|
569
|
0
|
|
|
|
|
|
$part .= $ch_ascii; |
570
|
0
|
|
|
|
|
|
$chars_count++; |
571
|
0
|
|
|
|
|
|
$ascii = substr($ascii, 1, $ascii_length--); |
572
|
|
|
|
|
|
|
} |
573
|
|
|
|
|
|
|
elsif ($chars_count < 152 and $ch_gsm > 0xFF) { |
574
|
0
|
|
|
|
|
|
$part .= $ch_ascii; |
575
|
0
|
|
|
|
|
|
$chars_count += 2; |
576
|
0
|
|
|
|
|
|
$ascii = substr($ascii, 1, $ascii_length--); |
577
|
|
|
|
|
|
|
} |
578
|
|
|
|
|
|
|
else { |
579
|
0
|
|
|
|
|
|
push(@parts, $part); |
580
|
0
|
|
|
|
|
|
$part = ''; |
581
|
0
|
|
|
|
|
|
$chars_count = 0; |
582
|
|
|
|
|
|
|
} |
583
|
|
|
|
|
|
|
} |
584
|
0
|
|
|
|
|
|
push(@parts, $part); |
585
|
0
|
|
|
|
|
|
return (@parts); |
586
|
|
|
|
|
|
|
} |
587
|
|
|
|
|
|
|
1; |
588
|
|
|
|
|
|
|
|
589
|
|
|
|
|
|
|
__END__ |