C ++ Universal Unicodes

时间:2015-04-14 16:44:10

标签: c++ unicode

我有一个简单的问题,在其他任何地方找不到答案。基本上我试图创建一个通用函数来返回正确的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

1 个答案:

答案 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);