Добавление TCHAR к wstring: не работает - PullRequest
1 голос
/ 10 июля 2011

У меня есть кое-что довольно простое, я пытаюсь предложить пользователю ввести символ и сохранить этот символ в строку.Затем я печатаю всю строку.

Программа предназначена для Windows, но я хочу, чтобы программа работала как для ASCII, так и для Unicode, поэтому я использую TCHAR & wstring.

MyПроблема: Я не могу добавить символ (который вводит пользователь) в строку wstring.Это просто не будет храниться в этой переменной.Почему?

Мой простой код:

#include <windows.h>
#include <tchar.h>
#include <conio.h>  
#include <stdio.h>  
#include <string>
#include <iostream>

using namespace std;

int main()
{
    // I am using wstring for unicode compatibility but in Windows(MSDN) is there a general
    // string variable? You know how there is char, wchar & then TCHAR(which is a general variable
    // for both ASCII & unicode). Is there a TSTRING or something?
    wstring chStr = L"abc";  
    TCHAR ch      = L'a';

    while ( ch != '!' )
    {
          printf("Enter a character: ");
          ch = getch();
          chStr += ch; // the string never takes on a char it always remains as "a"
          printf("\nThe characters entered so far are: %s \n", chStr.c_str()); 
    }

    system("PAUSE");
    return 0;   
}

Ответы [ 3 ]

1 голос
/ 10 июля 2011

Вы можете использовать tchar* input, а затем

 wstring chStr = L"abc";  
 std::wstring s(input)
 chStr += s;
0 голосов
/ 10 июля 2011

Ваш тест показывает не то, что вы думаете.

Функция printf ожидает строковые параметры ASCII для спецификации формата %s . UNICODE-представление для буквы a равно 0x0061, которое хранится в памяти как 0x61, 0x00 (потому что мы имеем дело с системой little-endian ). Поскольку printf интерпретирует память как строку ASCII, 0x61, 0x00 выглядит как строка с нулевым символом в конце, длиной в один символ, так что это то, что вы печатаете.

Больше не имеет смысла использовать TCHAR. Тип TCHAR - это WCHAR или char, в зависимости от того, определен ли макрос UNICODE или нет . TCHAR полезен в тех случаях, когда вы хотите написать код, который может быть скомпилирован дважды - один раз для ASCII и один раз для UNICODE. Например, если вы хотите написать код, который можно скомпилировать для эффективной работы на платформах ASCII (например, Windows 95) и снова скомпилировать для эффективной работы на платформах UNICODE (например, Windows XP).

Теперь, когда все текущие операционные системы Windows изначально являются UNICODE, TCHAR практически не используется и существует некоторый риск его использования.

Например, ваш код TCHAR ch = L'a'; действителен при компиляции для UNICODE, поскольку в этом случае TCHAR определен как WCHAR. Но при компиляции для не UNICODE TCHAR определяется как char, и назначение символа Unicode, такого как L'a', для переменной char на самом деле не имеет смысла. Вы не обязательно получите синтаксическую ошибку, но вы также не обязательно получите ожидаемый код.

Примечание Там, где я использовал «ASCII» выше, мне, вероятно, следовало бы сказать «многобайтовый набор символов» или «набор символов не-UNICODE», так как не все наборы символов не-UNICODE являются ASCII.

0 голосов
/ 10 июля 2011

http://linux.about.com/library/cmd/blcmdl3_wprintf.htm

говорит, что вам нужно использовать % ls не% s с wprintf ()

:)

вы видите, это читает широкую строку как строку символов с одним символом и нулем.

...