我有一个简单的问题,在其他任何地方找不到答案。基本上我试图创建一个通用函数来返回正确的unicode(而不是文字),如下面std :: string getUnicode()函数所示。 \ xe2 \ x99 \ xa和cardType被视为输出中的两个单独的字符串,这会导致“?”然后是cardType号。
在这种情况下:
cout << "\xe2\x99\xa0"; //prints out a symbol, GOOD
cout << "\xe2\x99\xa" << 0; //prints out "?" followed by 0. BAD
cout << card.getUnicode(); //prints out "?" followed by 0. BAD
有什么想法吗? 4-6个月的初学者到C ++。
#ifndef CARD_H
#define CARD_H
#include <map>
#include <sstream>
#include <string>
enum CARD_TYPE {SPADE = 0, CLUB = 3, HEART = 5, DIAMOND = 6};
class Card {
private:
int number;
CARD_TYPE cardType;
public:
Card(CARD_TYPE, int);
void displayCard();
int getNumber() {
return number;
}
CARD_TYPE getCardType() {
return cardType;
}
/* Returns Unicode Value for this Card Type */
std::string getUnicode() {
std::stringstream ss;
ss << "\xe2\x99\xa" << cardType;
return ss.str();
}
};
#endif
答案 0 :(得分:3)
这在C ++标准第2.14.5节第13段中讨论过:
[实施例:
在连接后,"\xA" "B"
包含两个字符
'\xA'
和'B'
(而不是单个十六进制字符'\xAB'
)。 - 结束例子]
问题是'\xa'
被视为单个字符(十六进制值0xa
是十进制的10,它映射到{{3}中的\n
(换行)字符}} / UTF)。 cardType
没有“附加”到转义序列。实际上,转义序列是在编译时计算的,而不是运行时(这是评估卡类型的时候)。
为了实现这一点,您需要执行以下操作:
ss << "\xe2\x99" << static_cast<char>(0xa0 + cardType);