如何读取具有Unicode代码的文本文件

How do I read a text file having Unicode codes?

本文关键字:代码 Unicode 文本 文件 何读取 读取      更新时间:2023-10-16

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

  std::string unicode8String = "u00C1 Mu00F3ti Su00F3l";

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

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

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

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

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位。

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

您可以尝试使用"std::wcout"打印吗!

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

用于评估

int main()
{
    // Write
    {
        std::string s = "u00C1 Mu00F3ti Su00F3l";
        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