{"id":828,"date":"2020-03-07T13:00:00","date_gmt":"2020-03-07T13:00:00","guid":{"rendered":"https:\/\/mobiletidings.com\/?p=828"},"modified":"2020-03-07T13:00:00","modified_gmt":"2020-03-07T13:00:00","slug":"gsm-7-encoding-gnu-libiconv","status":"publish","type":"post","link":"https:\/\/techsofar.com\/gsm-7-encoding-gnu-libiconv\/","title":{"rendered":"GSM-7 Encoding With The GNU iconv Library"},"content":{"rendered":"
To produce the GSM-7 encoded text that is needed for SMS text messages sent with a GSM modem in PDU mode we need 2 steps.<\/p>\n
The GSM-7 character set is described in\u00a03GPP TS 23.038<\/a>.<\/p>\n I\u2019ve always been a fan of the GNU iconv library (libiconv<\/a>). This library lets you convert practically any character set to any other character set. It does this by internally:<\/p>\n Unfortunately\u00a0libiconv\u00a0does not have support for the GSM-7 character set, so I have added it myself.<\/span>\u00a0I created 2 functions:<\/p>\n These functions are in a file called \u201cgsm7.h\u201d, the source code is below.<\/p>\n To integrate these functions into the iconv library I changed a few files:<\/p>\n DEFENCODING(( "GSM-7", This is adding my functions to the iconv library. My character set will be identified by \u201cGSM-7\u201d and alias \u201cGSM7\u201d.<\/p>\n GSM-7, ei_gsm7 Here, finally is the source of \u201cgsm-7\u201d:<\/p>\n[php]\n \/* After adding this code to the iconv library we can use it to convert text encoded arbitrary character sets into GSM-7 using the\u00a0libiconv\u00a0functions\u00a0iconv_open,\u00a0iconv\u00a0and\u00a0iconv_close.<\/p>\n If anybody working on GNU libiconv reads this article: I\u2019d be really pleased if this character set could be added to the official libiconv distribution.<\/p>\n The second step required to produce GSM-7 encoded strings for PDU mode is\u00a0packing the GSM-7 characters into septets<\/a>. As discussed\u00a0before<\/a> this is not so straight forward.<\/p>\n","protected":false},"excerpt":{"rendered":"To produce the GSM-7 encoded text that is needed for SMS text messages sent with a GSM modem…\n","protected":false},"author":2,"featured_media":831,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[29],"tags":[],"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"https:\/\/techsofar.com\/wp-content\/uploads\/2020\/03\/gsm-7-encoding.jpg","_links":{"self":[{"href":"https:\/\/techsofar.com\/wp-json\/wp\/v2\/posts\/828"}],"collection":[{"href":"https:\/\/techsofar.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/techsofar.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/techsofar.com\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/techsofar.com\/wp-json\/wp\/v2\/comments?post=828"}],"version-history":[{"count":0,"href":"https:\/\/techsofar.com\/wp-json\/wp\/v2\/posts\/828\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/techsofar.com\/wp-json\/wp\/v2\/media\/831"}],"wp:attachment":[{"href":"https:\/\/techsofar.com\/wp-json\/wp\/v2\/media?parent=828"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/techsofar.com\/wp-json\/wp\/v2\/categories?post=828"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/techsofar.com\/wp-json\/wp\/v2\/tags?post=828"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}\n
\n
\n
\n"GSM7",
\n),
\ngsm7,
\n{ gsm7_mbtowc, NULL }, { gsm7_wctomb, NULL })<\/p>\n[\/php]\n\n
\nGSM7, ei_gsm7<\/p>\n[\/php]\n
\n* Copyright (C) 1999-2001 Free Software Foundation, Inc.
\n* This file is part of the GNU LIBICONV Library.
\n*
\n* The GNU LIBICONV Library is free software; you can redistribute it
\n* and\/or modify it under the terms of the GNU Library General Public
\n* License as published by the Free Software Foundation; either version 2
\n* of the License, or (at your option) any later version.
\n*
\n* The GNU LIBICONV Library is distributed in the hope that it will be
\n* useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
\n* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
\n* Library General Public License for more details.
\n*
\n* You should have received a copy of the GNU Library General Public
\n* License along with the GNU LIBICONV Library; see the file COPYING.LIB.
\n* If not, write to the Free Software Foundation, Inc., 59 Temple Place –
\n* Suite 330, Boston, MA 02111-1307, USA.
\n*\/
\n\/*
\n* This file was contributed by Jeroen @ Mobile Tidings (http:\/\/mobiletidings.com)
\n*\/
\nstatic ucs4_t gsmToUnicode[] =
\n{
\n\/* 0x00 *\/ 0x0040, \/* COMMERCIAL AT *\/
\n\/* 0x01 *\/ 0x00A3, \/* POUND SIGN *\/
\n\/* 0x02 *\/ 0x0024, \/* DOLLAR SIGN *\/
\n\/* 0x03 *\/ 0x00A5, \/* YEN SIGN *\/
\n\/* 0x04 *\/ 0x00E8, \/* LATIN SMALL LETTER E WITH GRAVE *\/
\n\/* 0x05 *\/ 0x00E9, \/* LATIN SMALL LETTER E WITH ACUTE *\/
\n\/* 0x06 *\/ 0x00F9, \/* LATIN SMALL LETTER U WITH GRAVE *\/
\n\/* 0x07 *\/ 0x00EC, \/* LATIN SMALL LETTER I WITH GRAVE *\/
\n\/* 0x08 *\/ 0x00F2, \/* LATIN SMALL LETTER O WITH GRAVE *\/
\n\/* 0x09 *\/ 0x00E7, \/* LATIN SMALL LETTER C WITH CEDILLA *\/
\n\/* 0x0A *\/ 0x000A, \/* LINE FEED *\/
\n\/* 0x0B *\/ 0x00D8, \/* LATIN CAPITAL LETTER O WITH STROKE *\/
\n\/* 0x0C *\/ 0x00F8, \/* LATIN SMALL LETTER O WITH STROKE *\/
\n\/* 0x0D *\/ 0x000D, \/* CARRIAGE RETURN *\/
\n\/* 0x0E *\/ 0x00C5, \/* LATIN CAPITAL LETTER A WITH RING ABOVE *\/
\n\/* 0x0F *\/ 0x00E5, \/* LATIN SMALL LETTER A WITH RING ABOVE *\/
\n\/* 0x10 *\/ 0x0394, \/* GREEK CAPITAL LETTER DELTA *\/
\n\/* 0x11 *\/ 0x005F, \/* LOW LINE *\/
\n\/* 0x12 *\/ 0x03A6, \/* GREEK CAPITAL LETTER PHI *\/
\n\/* 0x13 *\/ 0x0393, \/* GREEK CAPITAL LETTER GAMMA *\/
\n\/* 0x14 *\/ 0x039B, \/* GREEK CAPITAL LETTER LAMDA *\/
\n\/* 0x15 *\/ 0x03A9, \/* GREEK CAPITAL LETTER OMEGA *\/
\n\/* 0x16 *\/ 0x03A0, \/* GREEK CAPITAL LETTER PI *\/
\n\/* 0x17 *\/ 0x03A8, \/* GREEK CAPITAL LETTER PSI *\/
\n\/* 0x18 *\/ 0x03A3, \/* GREEK CAPITAL LETTER SIGMA *\/
\n\/* 0x19 *\/ 0x0398, \/* GREEK CAPITAL LETTER THETA *\/
\n\/* 0x1A *\/ 0x039E, \/* GREEK CAPITAL LETTER XI *\/
\n\/* 0x1B *\/ 0x00A0, \/* ESCAPE TO EXTENSION TABLE *\/
\n\/* 0x1C *\/ 0x00C6, \/* LATIN CAPITAL LETTER AE *\/
\n\/* 0x1D *\/ 0x00E6, \/* LATIN SMALL LETTER AE *\/
\n\/* 0x1E *\/ 0x00DF, \/* LATIN SMALL LETTER SHARP S (German) *\/
\n\/* 0x1F *\/ 0x00C9, \/* LATIN CAPITAL LETTER E WITH ACUTE *\/
\n\/* 0x20 *\/ 0x0020, \/* SPACE *\/
\n\/* 0x21 *\/ 0x0021, \/* EXCLAMATION MARK *\/
\n\/* 0x22 *\/ 0x0022, \/* QUOTATION MARK *\/
\n\/* 0x23 *\/ 0x0023, \/* NUMBER SIGN *\/
\n\/* 0x24 *\/ 0x00A4, \/* CURRENCY SIGN *\/
\n\/* 0x25 *\/ 0x0025, \/* PERCENT SIGN *\/
\n\/* 0x26 *\/ 0x0026, \/* AMPERSAND *\/
\n\/* 0x27 *\/ 0x0027, \/* APOSTROPHE *\/
\n\/* 0x28 *\/ 0x0028, \/* LEFT PARENTHESIS *\/
\n\/* 0x29 *\/ 0x0029, \/* RIGHT PARENTHESIS *\/
\n\/* 0x2A *\/ 0x002A, \/* ASTERISK *\/
\n\/* 0x2B *\/ 0x002B, \/* PLUS SIGN *\/
\n\/* 0x2C *\/ 0x002C, \/* COMMA *\/
\n\/* 0x2D *\/ 0x002D, \/* HYPHEN-MINUS *\/
\n\/* 0x2E *\/ 0x002E, \/* FULL STOP *\/
\n\/* 0x2F *\/ 0x002F, \/* SOLIDUS *\/
\n\/* 0x30 *\/ 0x0030, \/* DIGIT ZERO *\/
\n\/* 0x31 *\/ 0x0031, \/* DIGIT ONE *\/
\n\/* 0x32 *\/ 0x0032, \/* DIGIT TWO *\/
\n\/* 0x33 *\/ 0x0033, \/* DIGIT THREE *\/
\n\/* 0x34 *\/ 0x0034, \/* DIGIT FOUR *\/
\n\/* 0x35 *\/ 0x0035, \/* DIGIT FIVE *\/
\n\/* 0x36 *\/ 0x0036, \/* DIGIT SIX *\/
\n\/* 0x37 *\/ 0x0037, \/* DIGIT SEVEN *\/
\n\/* 0x38 *\/ 0x0038, \/* DIGIT EIGHT *\/
\n\/* 0x39 *\/ 0x0039, \/* DIGIT NINE *\/
\n\/* 0x3A *\/ 0x003A, \/* COLON *\/
\n\/* 0x3B *\/ 0x003B, \/* SEMICOLON *\/
\n\/* 0x3C *\/ 0x003C, \/* LESS-THAN SIGN *\/
\n\/* 0x3D *\/ 0x003D, \/* EQUALS SIGN *\/
\n\/* 0x3E *\/ 0x003E, \/* GREATER-THAN SIGN *\/
\n\/* 0x3F *\/ 0x003F, \/* QUESTION MARK *\/
\n\/* 0x40 *\/ 0x00A1, \/* INVERTED EXCLAMATION MARK *\/
\n\/* 0x41 *\/ 0x0041, \/* LATIN CAPITAL LETTER A *\/
\n\/* 0x42 *\/ 0x0042, \/* LATIN CAPITAL LETTER B *\/
\n\/* 0x43 *\/ 0x0043, \/* LATIN CAPITAL LETTER C *\/
\n\/* 0x44 *\/ 0x0044, \/* LATIN CAPITAL LETTER D *\/
\n\/* 0x45 *\/ 0x0045, \/* LATIN CAPITAL LETTER E *\/
\n\/* 0x46 *\/ 0x0046, \/* LATIN CAPITAL LETTER F *\/
\n\/* 0x47 *\/ 0x0047, \/* LATIN CAPITAL LETTER G *\/
\n\/* 0x48 *\/ 0x0048, \/* LATIN CAPITAL LETTER H *\/
\n\/* 0x49 *\/ 0x0049, \/* LATIN CAPITAL LETTER I *\/
\n\/* 0x4A *\/ 0x004A, \/* LATIN CAPITAL LETTER J *\/
\n\/* 0x4B *\/ 0x004B, \/* LATIN CAPITAL LETTER K *\/
\n\/* 0x4C *\/ 0x004C, \/* LATIN CAPITAL LETTER L *\/
\n\/* 0x4D *\/ 0x004D, \/* LATIN CAPITAL LETTER M *\/
\n\/* 0x4E *\/ 0x004E, \/* LATIN CAPITAL LETTER N *\/
\n\/* 0x4F *\/ 0x004F, \/* LATIN CAPITAL LETTER O *\/
\n\/* 0x50 *\/ 0x0050, \/* LATIN CAPITAL LETTER P *\/
\n\/* 0x51 *\/ 0x0051, \/* LATIN CAPITAL LETTER Q *\/
\n\/* 0x52 *\/ 0x0052, \/* LATIN CAPITAL LETTER R *\/
\n\/* 0x53 *\/ 0x0053, \/* LATIN CAPITAL LETTER S *\/
\n\/* 0x54 *\/ 0x0054, \/* LATIN CAPITAL LETTER T *\/
\n\/* 0x55 *\/ 0x0055, \/* LATIN CAPITAL LETTER U *\/
\n\/* 0x56 *\/ 0x0056, \/* LATIN CAPITAL LETTER V *\/
\n\/* 0x57 *\/ 0x0057, \/* LATIN CAPITAL LETTER W *\/
\n\/* 0x58 *\/ 0x0058, \/* LATIN CAPITAL LETTER X *\/
\n\/* 0x59 *\/ 0x0059, \/* LATIN CAPITAL LETTER Y *\/
\n\/* 0x5A *\/ 0x005A, \/* LATIN CAPITAL LETTER Z *\/
\n\/* 0x5B *\/ 0x00C4, \/* LATIN CAPITAL LETTER A WITH DIAERESIS *\/
\n\/* 0x5C *\/ 0x00D6, \/* LATIN CAPITAL LETTER O WITH DIAERESIS *\/
\n\/* 0x5D *\/ 0x00D1, \/* LATIN CAPITAL LETTER N WITH TILDE *\/
\n\/* 0x5E *\/ 0x00DC, \/* LATIN CAPITAL LETTER U WITH DIAERESIS *\/
\n\/* 0x5F *\/ 0x00A7, \/* SECTION SIGN *\/
\n\/* 0x60 *\/ 0x00BF, \/* INVERTED QUESTION MARK *\/
\n\/* 0x61 *\/ 0x0061, \/* LATIN SMALL LETTER A *\/
\n\/* 0x62 *\/ 0x0062, \/* LATIN SMALL LETTER B *\/
\n\/* 0x63 *\/ 0x0063, \/* LATIN SMALL LETTER C *\/
\n\/* 0x64 *\/ 0x0064, \/* LATIN SMALL LETTER D *\/
\n\/* 0x65 *\/ 0x0065, \/* LATIN SMALL LETTER E *\/
\n\/* 0x66 *\/ 0x0066, \/* LATIN SMALL LETTER F *\/
\n\/* 0x67 *\/ 0x0067, \/* LATIN SMALL LETTER G *\/
\n\/* 0x68 *\/ 0x0068, \/* LATIN SMALL LETTER H *\/
\n\/* 0x69 *\/ 0x0069, \/* LATIN SMALL LETTER I *\/
\n\/* 0x6A *\/ 0x006A, \/* LATIN SMALL LETTER J *\/
\n\/* 0x6B *\/ 0x006B, \/* LATIN SMALL LETTER K *\/
\n\/* 0x6C *\/ 0x006C, \/* LATIN SMALL LETTER L *\/
\n\/* 0x6D *\/ 0x006D, \/* LATIN SMALL LETTER M *\/
\n\/* 0x6E *\/ 0x006E, \/* LATIN SMALL LETTER N *\/
\n\/* 0x6F *\/ 0x006F, \/* LATIN SMALL LETTER O *\/
\n\/* 0x70 *\/ 0x0070, \/* LATIN SMALL LETTER P *\/
\n\/* 0x71 *\/ 0x0071, \/* LATIN SMALL LETTER Q *\/
\n\/* 0x72 *\/ 0x0072, \/* LATIN SMALL LETTER R *\/
\n\/* 0x73 *\/ 0x0073, \/* LATIN SMALL LETTER S *\/
\n\/* 0x74 *\/ 0x0074, \/* LATIN SMALL LETTER T *\/
\n\/* 0x75 *\/ 0x0075, \/* LATIN SMALL LETTER U *\/
\n\/* 0x76 *\/ 0x0076, \/* LATIN SMALL LETTER V *\/
\n\/* 0x77 *\/ 0x0077, \/* LATIN SMALL LETTER W *\/
\n\/* 0x78 *\/ 0x0078, \/* LATIN SMALL LETTER X *\/
\n\/* 0x79 *\/ 0x0079, \/* LATIN SMALL LETTER Y *\/
\n\/* 0x7A *\/ 0x007A, \/* LATIN SMALL LETTER Z *\/
\n\/* 0x7B *\/ 0x00E4, \/* LATIN SMALL LETTER A WITH DIAERESIS *\/
\n\/* 0x7C *\/ 0x00F6, \/* LATIN SMALL LETTER O WITH DIAERESIS *\/
\n\/* 0x7D *\/ 0x00F1, \/* LATIN SMALL LETTER N WITH TILDE *\/
\n\/* 0x7E *\/ 0x00FC, \/* LATIN SMALL LETTER U WITH DIAERESIS *\/
\n\/* 0x7F *\/ 0x00E0 \/* LATIN SMALL LETTER A WITH GRAVE *\/
\n};
\nstatic struct
\n{
\nunsigned char from;
\nucs4_t to;
\n} gsmEscapes[] =
\n{
\n{ 0x0A, 0x000C }, \/* FORM FEED *\/
\n{ 0x14, 0x005E }, \/* CIRCUMFLEX ACCENT *\/
\n{ 0x28, 0x007B }, \/* LEFT CURLY BRACKET *\/
\n{ 0x29, 0x007D }, \/* RIGHT CURLY BRACKET *\/
\n{ 0x2F, 0x005C }, \/* REVERSE SOLIDUS *\/
\n{ 0x3C, 0x005B }, \/* LEFT SQUARE BRACKET *\/
\n{ 0x3D, 0x007E }, \/* TILDE *\/
\n{ 0x3E, 0x005D }, \/* RIGHT SQUARE BRACKET *\/
\n{ 0x40, 0x007C }, \/* VERTICAL LINE *\/
\n{ 0x65, 0x20AC }, \/* EURO SIGN *\/
\n{ 0 , 0 }
\n};
\nstatic int
\ngsm7_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n)
\n{
\nint i = 0;
\nif( *s > 0x7f )
\nreturn RET_ILSEQ;
\nelse if( *s == 0x1B ) {
\nif( n >= 2 ) {
\nwhile( gsmEscapes[ i ].from ) {
\nif( gsmEscapes[ i ].from == s[1] ) {
\n*pwc = gsmEscapes[ i ].to;
\nreturn 2;
\n}
\ni++;
\n}
\nreturn RET_ILSEQ;
\n} else
\nreturn RET_TOOFEW( 1 );
\n}
\n*pwc = gsmToUnicode[ *s ];
\nreturn 1;
\n}
\nstatic int
\ngsm7_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n)
\n{
\nunsigned char s1, s2;
\ns1 = (wc & 0xff00) >> 8;
\ns2 = wc & 0x00ff;
\nif( s1 == 0x00 ) {
\nif( s2 == 0xA || s2 == 0xD ||
\n(s2 >= 0x20 && s2 <= 0x23 ) || (s2 >= 0x25 && s2 <= 0x3f)
\n|| (s2 >= 0x41 && s2 <= 0x5A) || (s2 >= 0x61 && s2 <= 0x7A) ) {
\n*r = s2;
\nreturn 1;
\n} else {
\nswitch( s2 ) {
\ncase 0x24: *r = 0x02; return 1;
\ncase 0x40: *r = 0x00; return 1;
\ncase 0x5b: if( n >= 2 ) {r[0] = 0x1b; r[1] = 0x3c; return 2; }
\nelse return RET_TOOSMALL;
\ncase 0x5c: if( n >= 2 ) {r[0] = 0x1b; r[1] = 0x2f; return 2; }
\nelse return RET_TOOSMALL;
\ncase 0x5d: if( n >= 2 ) {r[0] = 0x1b; r[1] = 0x3e; return 2; }
\nelse return RET_TOOSMALL;
\ncase 0x5e: if( n >= 2 ) {r[0] = 0x1b; r[1] = 0x14; return 2; }
\nelse return RET_TOOSMALL;
\ncase 0x5f: *r = 0x11; return 1;
\ncase 0x7b: if( n >= 2 ) {r[0] = 0x1b; r[1] = 0x28; return 2; }
\nelse return RET_TOOSMALL;
\ncase 0x7c: if( n >= 2 ) {r[0] = 0x1b; r[1] = 0x40; return 2; }
\nelse return RET_TOOSMALL;
\ncase 0x7d: if( n >= 2 ) {r[0] = 0x1b; r[1] = 0x29; return 2; }
\nelse return RET_TOOSMALL;
\ncase 0x7e: if( n >= 2 ) {r[0] = 0x1b; r[1] = 0x3d; return 2; }
\nelse return RET_TOOSMALL;
\ncase 0xa3: *r = 0x01; return 1;
\ncase 0xa4: *r = 0x24; return 1;
\ncase 0xa5: *r = 0x03; return 1;
\ncase 0xa7: *r = 0x5f; return 1;
\ncase 0xb0: *r = 0x24; return 1;
\ncase 0xbf: *r = 0x60; return 1;
\ncase 0xc5: *r = 0x0e; return 1;
\ncase 0xc6: *r = 0x1c; return 1;
\ncase 0xc7: *r = 0x09; return 1;
\ncase 0xc9: *r = 0x1f; return 1;
\ncase 0xc4: *r = 0x5b; return 1;
\ncase 0xd1: *r = 0x5d; return 1;
\ncase 0xd6: *r = 0x5c; return 1;
\ncase 0xd8: *r = 0x0b; return 1;
\ncase 0xdc: *r = 0x5e; return 1;
\ncase 0xdf: *r = 0x1e; return 1;
\ncase 0xe0: *r = 0x7f; return 1;
\ncase 0xe4: *r = 0x7b; return 1;
\ncase 0xe5: *r = 0x0f; return 1;
\ncase 0xe6: *r = 0x1d; return 1;
\ncase 0xe7: *r = 0x09; return 1;
\ncase 0xe8: *r = 0x04; return 1;
\ncase 0xe9: *r = 0x05; return 1;
\ncase 0xec: *r = 0x07; return 1;
\ncase 0xf1: *r = 0x7d; return 1;
\ncase 0xf2: *r = 0x08; return 1;
\ncase 0xf6: *r = 0x7c; return 1;
\ncase 0xf8: *r = 0x0c; return 1;
\ncase 0xf9: *r = 0x06; return 1;
\ncase 0xfc: *r = 0x7e; return 1;
\n\/* one way mappings *\/
\ncase 0xc0: *r = 0x41; return 1;
\ncase 0xc1: *r = 0x41; return 1;
\ncase 0xc2: *r = 0x41; return 1;
\ncase 0xc3: *r = 0x41; return 1;
\ncase 0xc8: *r = 0x45; return 1;
\ncase 0xca: *r = 0x45; return 1;
\ncase 0xcb: *r = 0x45; return 1;
\ncase 0xcc: *r = 0x49; return 1;
\ncase 0xcd: *r = 0x49; return 1;
\ncase 0xce: *r = 0x49; return 1;
\ncase 0xcf: *r = 0x49; return 1;
\ncase 0xd2: *r = 0x4f; return 1;
\ncase 0xd3: *r = 0x4f; return 1;
\ncase 0xd4: *r = 0x4f; return 1;
\ncase 0xd5: *r = 0x4f; return 1;
\ncase 0xd9: *r = 0x55; return 1;
\ncase 0xda: *r = 0x55; return 1;
\ncase 0xdb: *r = 0x55; return 1;
\ncase 0xdd: *r = 0x59; return 1;
\ncase 0xe1: *r = 0x61; return 1;
\ncase 0xe2: *r = 0x61; return 1;
\ncase 0xe3: *r = 0x61; return 1;
\ncase 0xea: *r = 0x65; return 1;
\ncase 0xeb: *r = 0x65; return 1;
\ncase 0xed: *r = 0x69; return 1;
\ncase 0xee: *r = 0x69; return 1;
\ncase 0xef: *r = 0x69; return 1;
\ncase 0xf3: *r = 0x6f; return 1;
\ncase 0xf4: *r = 0x6f; return 1;
\ncase 0xf5: *r = 0x6f; return 1;
\ncase 0xfa: *r = 0x75; return 1;
\ncase 0xfb: *r = 0x75; return 1;
\ncase 0xfd: *r = 0x79; return 1;
\ncase 0xff: *r = 0x79; return 1;
\n}
\n}
\nreturn RET_ILUNI;
\n} else if( s1 == 0x20 ) {
\nif( s2 == 0xac ) {
\nif( n >= 2 ) {
\nr[0] = 0x1b; r[1] = 0x65; return 2;
\n} else return RET_TOOSMALL;
\n}
\n} else if( s1 = 0x03 ) {
\nswitch( s2 ) {
\ncase 0x94: *r = 0x10; return 1;
\ncase 0xa6: *r = 0x12; return 1;
\ncase 0x93: *r = 0x13; return 1;
\ncase 0x9b: *r = 0x14; return 1;
\ncase 0xa9: *r = 0x15; return 1;
\ncase 0xa0: *r = 0x16; return 1;
\ncase 0xa8: *r = 0x17; return 1;
\ncase 0xa3: *r = 0x18; return 1;
\ncase 0x98: *r = 0x19; return 1;
\ncase 0x9e: *r = 0x1a; return 1;
\ncase 0x91: *r = 0x41; return 1;
\ncase 0x92: *r = 0x42; return 1;
\ncase 0x95: *r = 0x45; return 1;
\ncase 0x97: *r = 0x48; return 1;
\ncase 0x99: *r = 0x49; return 1;
\ncase 0x9a: *r = 0x4b; return 1;
\ncase 0x9c: *r = 0x4d; return 1;
\ncase 0x9d: *r = 0x4e; return 1;
\ncase 0x9f: *r = 0x4f; return 1;
\ncase 0xa1: *r = 0x50; return 1;
\ncase 0xa4: *r = 0x54; return 1;
\ncase 0xa5: *r = 0x55; return 1;
\ncase 0xa7: *r = 0x58; return 1;
\ncase 0x96: *r = 0x5a; return 1;
\n}
\nreturn RET_ILUNI;
\n}
\nreturn RET_ILUNI;
\n}<\/p>\n[\/php]\nNext we need to pack the GSM-7 characters into septets.<\/h4>\n