0

我使用以下代码初始化一个字符串。

  std::string unicode8String = "\u00C1 M\u00F3ti S\u00F3l";

使用 打印它cout,输出是Á Móti Sól

但是,当我使用从文本文件中读取相同的字符串ifstream,将其存储在 astd::string中并打印时,输出为\u00C1 M\u00F3ti S\u00F3l

我的文件的内容是\u00C1 M\u00F3ti S\u00F3l,我想将其打印为Á Móti Sól。有没有办法做到这一点?

4

3 回答 3

0

unicode 字符在文本文件中具有不同的表示形式(没有 \u)。

用于评估

int main()
{
    // Write
    {
        std::string s = "\u00C1 M\u00F3ti S\u00F3l";
        std::ofstream out("/tmp/test.txt");
        out << s;
    }
    // Read Text
    {
        std::string s;
        std::ifstream in("/tmp/test.txt");
        std::getline(in, s);
        std::cout << "Result: " << s << std::endl;
    }
    // Read Binary
    {
        std::ifstream in("/tmp/test.txt");
        in.unsetf(std::ios_base::skipws);
        std::istream_iterator<unsigned char> first(in);
        std::istream_iterator<unsigned char> last;
        std::vector<unsigned char> v(first, last);
        std::cout << "Result: ";
        for(unsigned c: v) std::cout << std::hex << c << ' ';
        std::cout << std::endl;
    }
    return 0;
}

在带有 UTF8 的 Linux 上: 结果:Á Móti Sól 结果:c3 81 20 4d c3 b3 74 69 20 53 c3 b3 6c

于 2013-08-23T08:13:44.610 回答
0

在我的头顶上(完全未经测试)

std::string convert_string(const std::string& in)
{
    std::string out;
    for (size_t i = 0; i < in.size(); )
    {
        if (i + 5 < in.size() && in[i] == '\\' && in[i+1] == 'u' && 
            in[i+2] == '0' && in[i+3] == '0' && 
            isxdigit(in[i+4]) && isxdigit(in[i+5]))
        {
            out += (unsigned char)16*in[i+4] + (unsigned char)in[i+5];
            i += 6;
        }
        else
        {
            out += in[i];
            ++i;
        }
    }
    return out;
}

但这不适用于任何高于 255 的 unicode 值(例如 \u1234),因为您的字符串存储 8 位字符的基本问题是,而 Unicode 字符最多可以有 20 位。

正如我所说的完全未经测试,但我相信你明白了。

于 2013-08-23T07:03:49.227 回答
0

你可以试试用“ std::wcout”打印吗!

于 2013-08-23T07:07:44.893 回答