Determining if a string is Unicode

From: Jerry West (jw_at_comcast.net)
Date: 12/01/04


Date: Wed, 1 Dec 2004 10:51:39 -0800

I have a strange issue I can't seem to get a handle on. I'm reading in an
INF file like so:

Public Function mP_GetFileText(sFileName As String, Optional bNoLock As
Boolean = True, Optional nStart As Long = 1) As String

    Dim sText As String

    Dim i As Integer

    i% = FreeFile

    If gFSO.FileExists(sFileName$) Then

        If bNoLock Then Open sFileName$ For Binary Access Read Lock Write As
i% Else Open sFileName$ For Binary Access Read As i%

            sText$ = String$(LOF(i%), 0)
            Get i%, nStart&, sText$

        Close i%

        mP_GetFileText = sText$

    End If

End Function

If the INF file is read from a NT based system it appears to be in Unicode.
Viewing the string in the watch window has every other char as a Null. If I
then perform this operation on it it then it appears as a "normal"
(non-Unicode) string:

sString$ = StrConv(sString, vbFromUnicode)

Now, if I read in the INF file from a 9x based computer the string does not
appear to be in Unicode. Further, if I perform the StrConv operation on this
string it changes the entire string to all question marks.

This left me with attempting to determine whether or not the INF file read
is in Unicode or not. First I tried examining the VarType() value. However
for either type of string returned the value was always an 8 (8 = string).
Clearly both types of strings are NOT the same so this seems odd to me. I
clearly cannot perform the StrConv function on the already "normal" string
w/o changing it to all question marks. I then thought I'd try to read the
files in using a different method like so:

mP_GetFileText = gFSO.OpenTextFile(sFileName$, ForReading,
TristateFalse).ReadAll

This also failed. No matter what Tristate value I would use the string
returned was always Null chars IF the INF file being read was on a remote 9x
or NT system. It would work OK when reading local files. Finally, I tried
creating a function that would return True if the string was Unicode like
so:

    Dim l As Long

    Dim sa() As Byte

    On Error GoTo ErrHandler

    sa = sString$

    If (UBound(v) > -1) Then

        For l& = 1 To UBound(sa) Step 2

            If (sa(l&) <> 0) Then Exit For

        Next l&

        mP_IsStringNonEnglishUnicode = (l& < UBound(sa))

    End If

This also would not properly detect that the "normal" string was non-Unicode
(if that is what it is).

Has anyone else seen this type of issue before? Is there a way to detect the
difference between these two string types? I'm not even certain that the
string read from the NT based system is in Unicode at this point. Does
anyone have any comments to share on this situation?

Thanks!

JW



Relevant Pages

  • Re: Determining if a string is Unicode
    ... there's nothing magic about Unicode. ... where each character occupies 2 bytes, as opposed to a Single-Byte Character ... You could load up a string with rubbish, ... > INF file like so: ...
    (microsoft.public.vb.general.discussion)
  • Re: Determining if a string is Unicode
    ... A VB string is a BSTR, which is always unicode. ... but try creating a new INF file on the NT based ... > Dim sText As String ...
    (microsoft.public.vb.general.discussion)
  • Replace string in .inf file
    ... I would to replace one string by another string an .inf file which was create by Windows. ... I have a script which works with all my test files but it's don't work with the original .inf file. ... Probably a problem with unicode text because all .inf files begin with: ... Sub ChangeText ...
    (microsoft.public.scripting.vbscript)
  • Re: Determining if a string is Unicode
    ... bytes per character, and MULTI-byte occupies one!!?? ... there's nothing magic about Unicode. ... You could load up a string with rubbish, ... if I read in the INF file from a 9x based computer the string does ...
    (microsoft.public.vb.general.discussion)
  • Re: Determining if a string is Unicode
    ... >Public Function mP_GetFileText(sFileName As String, ... > Dim sText As String ... >If the INF file is read from a NT based system it appears to be in Unicode. ...
    (microsoft.public.vb.general.discussion)

Loading