CodeGuru Home VC++ / MFC / C++ .NET / C# Visual Basic VB Forums Developer.com
Page 2 of 2 FirstFirst 12
Results 16 to 25 of 25
  1. #16
    Join Date
    Apr 2005
    Posts
    78

    Question Re: How to assign CString to wstring UNICODE compilation

    Quote Originally Posted by Arjay View Post
    While you *can* have both ANSI and UNICODE in a single program, I'd recommened that you compile your program for all UNICODE. If you have data coming in (or going out) that's then convert the data to UNICODE immediately so it's in one format throughout your program.

    The main reason for doing this is that the Windows Operating System uses UNICODE internally and any ANSI calls you make, convert the strings to UNICODE and then just call the UNICODE version of the api. So there is extra overhead while interacting with the OS if your program is primarily in ANSI.
    Well i did not know that, thought it may have been the other way round.


    Iv recompiled my program now, after about 500 edits ;-) and is working, but...
    Im getting some strange comparison results.

    I have a pretty low level text comparator that also does a little parsing on some of the input.
    Dotted throughout the comparator is code like the following:


    if( temp[pos] == 'p' || temp[pos] == 'P' ){

    Is it necessary for me to prefix _T() or L on character literals too?

    Also need to detect some control codes and whitespace characters so also have


    while( pos < total && ( temp[pos] < 33 || temp[pos] > 126 ))


    I suspect now these are causing me problems as not comparing like with like?

    Can anyone clarify this issue?

    Thanks for everyones help.

  2. #17
    Lindley is offline Elite Member Power Poster
    Join Date
    Oct 2007
    Location
    Seattle, WA
    Posts
    10,895

    Re: How to assign CString to wstring UNICODE compilation

    Quote Originally Posted by PRMARJORAM View Post
    Can you have UNICODE and ASCII in the same program?
    What Microsoft calls "UNICODE" is simply a toggle which causes some functions to take wchar_ts rather than chars. That's all. It doesn't do a whole lot beyond that.

    You can represent Unicode data in UTF-8 using chars if you want. There's nothing forcing you to use wchar_ts and wide strings if you want to work with Unicode data.

    But as has been said, the OS's native encoding is UTF-16, and the same is true of the ICU library; so if you want to avoid conversions you should work with that.

  3. #18
    Arjay's Avatar
    Arjay is offline Moderator / EX MS MVP Power Poster
    Join Date
    Aug 2004
    Posts
    13,490

    Re: How to assign CString to wstring UNICODE compilation

    Quote Originally Posted by PRMARJORAM View Post
    if( temp[pos] == 'p' || temp[pos] == 'P' ){

    Is it necessary for me to prefix _T() or L on character literals too?
    Yes.

    Code:
     
    if( temp[pos] == _T('p') || temp[pos] == _T('P') )
    {
     
    }

  4. #19
    Join Date
    Apr 2005
    Posts
    78

    Re: How to assign CString to wstring UNICODE compilation

    Quote Originally Posted by Arjay View Post
    Yes.

    Code:
     
    if( temp[pos] == _T('p') || temp[pos] == _T('P') )
    {
     
    }
    But with the character literals you do not get compiler errors having switched to UNICODE.
    Why on strings but not on character literals?

  5. #20
    Arjay's Avatar
    Arjay is offline Moderator / EX MS MVP Power Poster
    Join Date
    Aug 2004
    Posts
    13,490

    Re: How to assign CString to wstring UNICODE compilation

    Quote Originally Posted by PRMARJORAM View Post
    But with the character literals you do not get compiler errors having switched to UNICODE.
    Why on strings but not on character literals?
    It depends how temp is defined. If defined as char[], then you won't get errors. If defined as wchar_t[], then you should. I find developers have the least amount of trouble when coding in windows if they don't use char and wchar_t and instead use the types defined in tchar.h.

    For more info, see A guideline for coding with strings in Windows.

  6. #21
    Join Date
    Feb 2005
    Posts
    2,160

    Re: How to assign CString to wstring UNICODE compilation

    Quote Originally Posted by Arjay View Post
    It depends how temp is defined. If defined as char[], then you won't get errors. If defined as wchar_t[], then you should.
    In this case, you're comparing two integral types so the compiler should promote each to int before the comparison, hence no warning. If it were an assignment, you should get a warning.

  7. #22
    Join Date
    Nov 2001
    Posts
    251

    Re: How to assign CString to wstring UNICODE compilation

    Quote Originally Posted by Arjay View Post
    Yes.

    Code:
     
    if( temp[pos] == _T('p') || temp[pos] == _T('P') )
    {
     
    }
    For literals in the ASCII range, I don't think this is explicitly necessary.
    My compiler never complains about it. And my program works as expected.

  8. #23
    Arjay's Avatar
    Arjay is offline Moderator / EX MS MVP Power Poster
    Join Date
    Aug 2004
    Posts
    13,490

    Re: How to assign CString to wstring UNICODE compilation

    Here's the way I look at it. When I program for Windows, I wrap any string or char literals in _T() and I never have to worry about it.

  9. #24
    Join Date
    Apr 2005
    Posts
    78

    Angry Re: How to assign CString to wstring UNICODE compilation

    Quote Originally Posted by Arjay View Post
    Here's the way I look at it. When I program for Windows, I wrap any string or char literals in _T() and I never have to worry about it.
    temp is defined as wstring(previously string). This library which until now was comparing only ascii codes in just std C++ although used by a Visual C++ front end application.

    So I doubt the character literals are causing the problem as they would be promoted, and as I understand, the ASCII encoding is the same in UNICODE, I mean they have the same numerical numbers?

    It not clear to me at this point what is causing the problem. It was previously a string comparator now a wstring comparator with the input being ASCII codes but now being converted to UNICODE. I mean Im not reading in anything yet that falls outside the ASCII range.

  10. #25
    Join Date
    Apr 2005
    Posts
    78

    Re: How to assign CString to wstring UNICODE compilation

    My problem now is in actually reading in an input file using UNICODE version of everything.
    I have the following code:

    CString line;
    // !!! Do not include newlines
    while( file->ReadString( line ) ){
    mSource += line;
    }
    Where file is CHttpFile
    and mSource is wstring.

    Whats happening is the input text is being cut short in this UNICODE compilation?
    Any ideas whats happening here? Has been working fine.

Page 2 of 2 FirstFirst 12

Tags for this Thread

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  





Click Here to Expand Forum to Full Width

Featured