differing sizes of wchar_t (client vs server)

From: Henry Townsend (henry.townsend_at_not.here)
Date: 09/25/05


Date: Sun, 25 Sep 2005 17:12:31 -0400

I hope I'm missing something obvious here ...

My app reads text data over a socket. It's actually done via libcurl
(http://curl.haxx.se) but that doesn't matter here; the point is that I
am presented with a void * pointing to a block of raw data and a long
giving the number of bytes in the block, and that's it.

However, since my app comprises both server and client the client knows
the data is line-oriented text. All it needs to do is break it into
lines and print them to stdout, skipping certain lines. This is not
hard, using a bunch of <string.h> routines like strchr and strstr, plus
fputs(). I have this all working - when the text is 8-bit ASCII.

But for full generality I'd like the server to deliver text in the UCS-2
charset (Unicode). I figured handling this on the client side would be a
simple matter of transposing char to wchar_t and strlen() to wcslen(),
etc. But it turns out that wchar_t on my platform (and on many,
including Linux and Solaris) is 4 bytes wide. So I've got a stream of
16-bit characters from the server and mechanisms for handling 8- and
32-bit - but not 16-bit - character streams on the client!

Is there a common/elegant solution? I could allocate a buffer twice as
big as the incoming data and promote to 4-byte chars before operating on
it but that would be inelegant to say the least. Not to mention the
platforms where wchar_t is 2 bytes. I guess I could pass sizeof(wchar_t)
to the server and have it respond with 2- or 4-byte data based on that,
but that would mean a doubling of bandwidth consumption. What do people
usually do about this "impedance mismatch"?

Background: the data is basically just a list of filenames. I want to
store them in a Unicode format (which is easy on the server side since
it's written in Java where UTF-16 is the native format) because Windows
pathnames technically are Unicode. But there's not a lot of I18N stuff
to deal with here - I just want to be able to store and regurgitate
strings of 16-bit characters.

Thanks,
Henry Townsend

[PS I posted this to comp.lang.java.softwaretools first but that was
just a finger fumble. I meant to come here all along so please don't
accuse me of multiposting.]



Relevant Pages

  • differing sizes of wchar_t
    ... It's actually done via libcurl but that doesn't matter here; the point is that I am presented with a void * pointing to a block of raw data and a long giving the number of bytes in the block, ... since my app comprises both server and client I know the data is line-oriented text. ...
    (comp.lang.java.softwaretools)
  • Re: SQLClient Exception - Retrying
    ... service app which needs to continually run uninterrupted no matter what ... timeouts, sql server is down, etc. ... matter what the error may be, and continue to do so until the problem is ... yes it makes sense to retry. ...
    (microsoft.public.dotnet.framework.adonet)
  • RE: Prevent ODBC connections
    ... If the user has access to the server and the database, ... then it doesn't matter what tool they use. ... The app would have to be ...
    (microsoft.public.sqlserver.connect)
  • Terminal Services and KB article 186499
    ... Registry Settings for Applications on a Win2003 server? ... It doesn't seem to matter what combination of bits I use ... my App takes absolutely no notice and still reports the PC ... the Win2KAdv Server. ...
    (microsoft.public.windows.server.general)
  • Re: Homegrown synchronization
    ... to check for update files in the Import DropBox for the server. ... similar to the import code used to update a remote backend). ... code to close the "sync" app. ... synch app, but only one at a time would be able to do synchs. ...
    (microsoft.public.access.replication)

Quantcast