|
Scott
Thanks; I will not make excuses for my ignorance; but I feel 'tis better to try
new things than to carry on with the same old same old. I was writing this
programme to replace a CL with a cpyfrmpcd followed by a dodgy rpg programme
(yuck!).
By the way, I have made an amendment to your ifsio_h copy source member on our
system to add the ccsid:
D st_codepag 5U 0
MS#1 D st_ccsid 5U 0
D**st_resv11****MS#1------------62A
MS#1 D st_resv11 60A
We over here in Europe have lots of fun (NOT!) with ccsids, so this is of use
to us.
Thanks again, and to Barbara.
And I do understand all your and Barbara's comments about iconv; just itching
to use it in anger now!
Michael
> Message Received: May 18 2006, 08:08 AM
> From: "Scott Klement"
> To: "RPG programming on the AS400 / iSeries"
> Cc:
> Subject: Re: Using iconv to convert data FROM file READ from IFS
>
>
>
> > I read the file onto a pointer.
>
> I think I can safely assume that you're reading teh file into the memory
> that the pointer points to... Obviously, a pointer can't store file
> data, it can only store an address.
>
>
> > I open iconv with a to of 0 for the job and a from of the file's CCSID
> > Does not return an error.
>
> The IFS APIs will do this automatically if you pass the O_TEXTDATA flag.
> You don't need to use iconv()...
>
> > I iconv the data on the pointer for the length of the data on the
> > pointer back onto itself. Again this does not return an error, but the
> > pointer is cleared and the length is set to zero. What am I doing wrong?
>
> It sounds to me like the only problem here is that you don't understand
> how the iconv() API works. What you describe could very well mean that
> iconv() was successful! I'll explain...
>
> When you call iconv(), you do something like this:
>
> iconv(cd: PtrToInput: InputLeft: PtrToOutput: OutputLeft)
>
> As iconv() converts each character, it changes PtrToInput to point to the
> next character that needs to be convered, and reduces the number of bytes
> left to convert.
>
> Likewise, it changes PtrToOutput to point to the space where the next
> output character will be placed, and decreases OutputLeft to reflect the
> amount of space left in the buffer.
>
> That way, if an untranslatable character should be found, the pointers
> will be pointing to that character and where it goes in the output buffer.
> Your program could add logic to do something special with that character.
> Or perhaps log an error message showing the unconvertable character. It
> could then add 1 to the input pointer, subtract one from the bytes left,
> and re-call iconv() and it'd pick up where it left off.
>
> When iconv() is done, the PtrToInput and PtrToOutput will be pointing to
> the next charater to translate, or to undefined locations if all
> translation has been done. You should not try to use them again.
>
> And if all went well, InputLeft will be 0, since the whole input string
> has been translated. OutputLeft will be the amount of unused space in the
> output buffer, or if the whole thing was used, it'll also be 0.
>
> So when you call iconv(), you should make sure of the following:
>
> a) Don't pass the actual pointer to the start of your data as the
> PtrToInput parameter. Instead, make a new pointer, and set it to the same
> address as the start of your data. That way, when iconv() changes the
> pointer, it won't affect your "start of buffer" pointer.
>
> Same with the output buffer.
>
>
> b) Same thing with the length... have a separate length var for "bytes
> left to translate". Before calling iconv(), set it to the length of the
> data, when it's done, subtract the "bytes left" field from the original
> length to find out how much was translated. Subtract the OutputLeft field
> from the original output length to find out the length of the data that
> iconv() wrote out.
>
> When converting from single-byte character sets to double-byte, the input
> and output lengths won't match. Also, make sure you use separate input
> and output buffers for those, or you'll end up with a corrupted mess.
>
> This also applies to unicode character sets, including (but not limited
> to) UTF-8.
>
> > I could use QDCXLATE but that would be admitting defeat.
>
> Not to mention, it would lead to a solution that's technically incorrect.
> You might be able to get it to work with a particular from/to CCSID, but
> it wouldn't work universally with any file.
>
> Once you understand iconv(), there's no reason why your solution shouldn't
> work -- however, I'm a bit puzzled by the whole thing, since the open(),
> read(), and write() APIs do all of this translation for you, so there's
> absolutely no need to code iconv() or QDCXLATE() unless you're doing
> something that's a bit more custom than what the IFS APIs do. Just pass
> O_TEXTDATA, and you don't need all of this other stuff.
>
> --
> This is the RPG programming on the AS400 / iSeries (RPG400-L) mailing list
> To post a message email: RPG400-L@xxxxxxxxxxxx
> To subscribe, unsubscribe, or change list options,
> visit: http://lists.midrange.com/mailman/listinfo/rpg400-l
> or email: RPG400-L-request@xxxxxxxxxxxx
> Before posting, please take a moment to review the archives
> at http://archive.midrange.com/rpg400-l.
>
>
>
As an Amazon Associate we earn from qualifying purchases.
This mailing list archive is Copyright 1997-2025 by midrange.com and David Gibbs as a compilation work. Use of the archive is restricted to research of a business or technical nature. Any other uses are prohibited. Full details are available on our policy page. If you have questions about this, please contact [javascript protected email address].
Operating expenses for this site are earned using the Amazon Associate program and Google Adsense.