efimka
December 27th, 2006, 04:48 AM
Hi
I have a specific problem with conversion of chinese characters on UNIX platform.
I need to convert string mixed with simplified chinese characters and numbers to simpified chinese buffer compatible with format UTF8
I have tried to use following function (see below)
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include <limits.h>
wchar_t *pCommArea;
char ZeroChar = 0;
char ImexTQ[4];
char text[1000];
void main(void) {
long RespCode1Link, RespCode2Link;
unsigned int ch;
unsigned char bt1, bt2, bt3, bt4, bt5, bt6;
int n;
wchar_t sFinal[1000];
wchar_t sTemp[1000];
memcpy(ImexTQ, "IXT0", 4);
memset( sFinal, 0, 1000 );
EXEC CICS ADDRESS
EIB ( dfheiptr )
RESP ( RespCode1Link )
RESP2( RespCode2Link );
if( RespCode1Link != 0 ) {
strcpy(text, "Abend on addressing to EIB.");
EXEC CICS WRITEQ TD
QUEUE(ImexTQ)
FROM(text)
LENGTH(strlen(text));
EXEC CICS ABEND
ABCODE( "NRSP" )
RESP ( RespCode1Link )
RESP2 ( RespCode2Link )
CANCEL;
EXEC CICS RETURN;
} /* endif */
/* Get addressability to the CWA */
EXEC CICS ADDRESS
CWA ( pCwa )
RESP ( RespCode1Link )
RESP2( RespCode2Link );
if( RespCode1Link != 0 ) {
strcpy(text, "Abend on addressing to CWA.");
EXEC CICS WRITEQ TD
QUEUE(ImexTQ)
FROM(text)
LENGTH(strlen(text));
EXEC CICS ABEND
ABCODE( "NRSP" )
RESP ( RespCode1Link )
RESP2 ( RespCode2Link )
CANCEL;
EXEC CICS RETURN;
} /* endif */
/* Get addressability to the comm area. */
EXEC CICS ADDRESS
COMMAREA( pCommArea )
RESP ( RespCode1Link )
RESP2 ( RespCode2Link );
if( RespCode1Link != 0 ) {
strcpy(text, "Abend on addressing to CommArea.");
EXEC CICS WRITEQ TD
QUEUE(ImexTQ)
FROM(text)
LENGTH(strlen(text));
EXEC CICS ABEND
ABCODE( "NRSP" )
RESP ( RespCode1Link )
RESP2 ( RespCode2Link )
CANCEL;
EXEC CICS RETURN;
}
for (n = 0; n < wcslen(pCommArea); ++n) {
memset( sTemp, 0, 1000 );
ch = (unsigned int)pCommArea[n];
if (ch == L'=' ) {
swprintf( sTemp, L"=%02X", ch );
wcscat( sFinal, sTemp );
swprintf( sTemp, L"=%02X", ch );
wcscat( sFinal, sTemp );
sprintf(text, "2. sFinal = %s", sFinal);
EXEC CICS WRITEQ TD
QUEUE(ImexTQ)
FROM(text)
LENGTH(strlen(text));
}
else if (ch < 128) {
sTemp[0] = pCommArea[n];
wcscat( sFinal, sTemp );
}
else if (ch <= 2047) {
bt1 = (unsigned char)(192 + (ch / 64));
bt2 = (unsigned char)(128 + (ch % 64));
swprintf( sTemp, L"=%02X=%02X", bt1, bt2 );
wcscat( sFinal, sTemp );
}
else if (ch <= 65535) {
bt1 = (unsigned char)(224 + (ch / 4096));
bt2 = (unsigned char)(128 + ((ch / 64) % 64));
bt3 = (unsigned char)(128 + (ch % 64));
sprintf(text, "Byte1 = %d, Byte2 = %d, Byte3 = %d", bt1, bt2, bt3);
EXEC CICS WRITEQ TD
QUEUE(ImexTQ)
FROM(text)
LENGTH(strlen(text));
swprintf( sTemp, L"=%02x=%02x=%02x", bt1, bt2, bt3 );
wcscat( sFinal, sTemp );
}
else if (ch <= 2097151) {
bt1 = (unsigned char)(240 + (ch / 262144));
bt2 = (unsigned char)(128 + ((ch / 4096) % 64));
bt3 = (unsigned char)(128 + ((ch / 64) % 64));
bt4 = (unsigned char)(128 + (ch % 64));
swprintf( sTemp, L"=%02X=%02X=%02X=%02X", bt1, bt2, bt3, bt4 );
wcscat( sFinal, sTemp );
}
else if (ch <= 67108863) {
bt1 = (unsigned char)(248 + (ch / 16777216));
bt2 = (unsigned char)(128 + ((ch / 262144) % 64));
bt3 = (unsigned char)(128 + ((ch / 4096) % 64));
bt4 = (unsigned char)(128 + ((ch / 64) % 64));
bt5 = (unsigned char)(128 + (ch % 64));
swprintf( sTemp, L"=%02X=%02X=%02X=%02X=%02X", bt1, bt2, bt3, bt4, bt5 );
wcscat( sFinal, sTemp );
}
else if (ch <= 2147483647) {
bt1 = (unsigned char)(252 + (ch / 1073741824));
bt2 = (unsigned char)(128 + ((ch / 16777216) % 64));
bt3 = (unsigned char)(128 + ((ch / 262144) % 64));
bt4 = (unsigned char)(128 + ((ch / 4096) % 64));
bt5 = (unsigned char)(128 + ((ch / 64) % 64));
bt6 = (unsigned char)(128 + (ch % 64));
swprintf( sTemp, L"=%02X=%02X=%02X=%02X=%02X=%02X", bt1, bt2, bt3, bt4, bt5, bt6);
wcscat( sFinal, sTemp );
}
}
memset( pCommArea, 0, sizeof( pCommArea ) );
wcscpy( pCommArea, sFinal );
EXEC CICS RETURN;
}
Function does not work.
Please, help to solve the problem, because don't have enough experience in this knowledge area.
Thank you.
I have a specific problem with conversion of chinese characters on UNIX platform.
I need to convert string mixed with simplified chinese characters and numbers to simpified chinese buffer compatible with format UTF8
I have tried to use following function (see below)
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include <limits.h>
wchar_t *pCommArea;
char ZeroChar = 0;
char ImexTQ[4];
char text[1000];
void main(void) {
long RespCode1Link, RespCode2Link;
unsigned int ch;
unsigned char bt1, bt2, bt3, bt4, bt5, bt6;
int n;
wchar_t sFinal[1000];
wchar_t sTemp[1000];
memcpy(ImexTQ, "IXT0", 4);
memset( sFinal, 0, 1000 );
EXEC CICS ADDRESS
EIB ( dfheiptr )
RESP ( RespCode1Link )
RESP2( RespCode2Link );
if( RespCode1Link != 0 ) {
strcpy(text, "Abend on addressing to EIB.");
EXEC CICS WRITEQ TD
QUEUE(ImexTQ)
FROM(text)
LENGTH(strlen(text));
EXEC CICS ABEND
ABCODE( "NRSP" )
RESP ( RespCode1Link )
RESP2 ( RespCode2Link )
CANCEL;
EXEC CICS RETURN;
} /* endif */
/* Get addressability to the CWA */
EXEC CICS ADDRESS
CWA ( pCwa )
RESP ( RespCode1Link )
RESP2( RespCode2Link );
if( RespCode1Link != 0 ) {
strcpy(text, "Abend on addressing to CWA.");
EXEC CICS WRITEQ TD
QUEUE(ImexTQ)
FROM(text)
LENGTH(strlen(text));
EXEC CICS ABEND
ABCODE( "NRSP" )
RESP ( RespCode1Link )
RESP2 ( RespCode2Link )
CANCEL;
EXEC CICS RETURN;
} /* endif */
/* Get addressability to the comm area. */
EXEC CICS ADDRESS
COMMAREA( pCommArea )
RESP ( RespCode1Link )
RESP2 ( RespCode2Link );
if( RespCode1Link != 0 ) {
strcpy(text, "Abend on addressing to CommArea.");
EXEC CICS WRITEQ TD
QUEUE(ImexTQ)
FROM(text)
LENGTH(strlen(text));
EXEC CICS ABEND
ABCODE( "NRSP" )
RESP ( RespCode1Link )
RESP2 ( RespCode2Link )
CANCEL;
EXEC CICS RETURN;
}
for (n = 0; n < wcslen(pCommArea); ++n) {
memset( sTemp, 0, 1000 );
ch = (unsigned int)pCommArea[n];
if (ch == L'=' ) {
swprintf( sTemp, L"=%02X", ch );
wcscat( sFinal, sTemp );
swprintf( sTemp, L"=%02X", ch );
wcscat( sFinal, sTemp );
sprintf(text, "2. sFinal = %s", sFinal);
EXEC CICS WRITEQ TD
QUEUE(ImexTQ)
FROM(text)
LENGTH(strlen(text));
}
else if (ch < 128) {
sTemp[0] = pCommArea[n];
wcscat( sFinal, sTemp );
}
else if (ch <= 2047) {
bt1 = (unsigned char)(192 + (ch / 64));
bt2 = (unsigned char)(128 + (ch % 64));
swprintf( sTemp, L"=%02X=%02X", bt1, bt2 );
wcscat( sFinal, sTemp );
}
else if (ch <= 65535) {
bt1 = (unsigned char)(224 + (ch / 4096));
bt2 = (unsigned char)(128 + ((ch / 64) % 64));
bt3 = (unsigned char)(128 + (ch % 64));
sprintf(text, "Byte1 = %d, Byte2 = %d, Byte3 = %d", bt1, bt2, bt3);
EXEC CICS WRITEQ TD
QUEUE(ImexTQ)
FROM(text)
LENGTH(strlen(text));
swprintf( sTemp, L"=%02x=%02x=%02x", bt1, bt2, bt3 );
wcscat( sFinal, sTemp );
}
else if (ch <= 2097151) {
bt1 = (unsigned char)(240 + (ch / 262144));
bt2 = (unsigned char)(128 + ((ch / 4096) % 64));
bt3 = (unsigned char)(128 + ((ch / 64) % 64));
bt4 = (unsigned char)(128 + (ch % 64));
swprintf( sTemp, L"=%02X=%02X=%02X=%02X", bt1, bt2, bt3, bt4 );
wcscat( sFinal, sTemp );
}
else if (ch <= 67108863) {
bt1 = (unsigned char)(248 + (ch / 16777216));
bt2 = (unsigned char)(128 + ((ch / 262144) % 64));
bt3 = (unsigned char)(128 + ((ch / 4096) % 64));
bt4 = (unsigned char)(128 + ((ch / 64) % 64));
bt5 = (unsigned char)(128 + (ch % 64));
swprintf( sTemp, L"=%02X=%02X=%02X=%02X=%02X", bt1, bt2, bt3, bt4, bt5 );
wcscat( sFinal, sTemp );
}
else if (ch <= 2147483647) {
bt1 = (unsigned char)(252 + (ch / 1073741824));
bt2 = (unsigned char)(128 + ((ch / 16777216) % 64));
bt3 = (unsigned char)(128 + ((ch / 262144) % 64));
bt4 = (unsigned char)(128 + ((ch / 4096) % 64));
bt5 = (unsigned char)(128 + ((ch / 64) % 64));
bt6 = (unsigned char)(128 + (ch % 64));
swprintf( sTemp, L"=%02X=%02X=%02X=%02X=%02X=%02X", bt1, bt2, bt3, bt4, bt5, bt6);
wcscat( sFinal, sTemp );
}
}
memset( pCommArea, 0, sizeof( pCommArea ) );
wcscpy( pCommArea, sFinal );
EXEC CICS RETURN;
}
Function does not work.
Please, help to solve the problem, because don't have enough experience in this knowledge area.
Thank you.