2

这甚至可能吗?我一直在尝试阅读一个包含俄语的简单文件,但它显然不起作用。

我调用了 file.imbue(loc)(此时,loc 是正确的,Russian_Russia.1251)。buf 的类型为 basic_string<wchar_t>

我使用 basic_ifstream<wchar_t> 的原因是因为这是一个模板(从技术上讲,basic_ifstream<T>,但在这种情况下,T=wchar_t)。

这一切都与英文字符完美配合......

while (file >> ch)
{
    if(isalnum(ch, loc))
    {
        buf += ch;
    }
    else if(!buf.empty())
    {
        // Do stuff with buf.
        buf.clear();
    }
}

我不明白为什么在阅读俄语字符时会出现垃圾。(例如,如果文件包含 хеы хеы хеы,我会得到“яюE”、5(正方形)、K(正方形)等...

4

4 回答 4

1

仍然有很多 STL 实现没有可以处理 Unicode 编码的 std::codecvt。它们的 wchar_t 模板流将默认为系统代码页,即使它们以其他方式启用了 Unicode,例如文件名。如果文件实际上包含 UTF-8,它们会产生垃圾。也许这会有所帮助

于 2010-03-17T17:42:12.280 回答
1

代码页 1251 不适用于 Unicode——如果有记忆,它适用于 8859-5。不幸的是,您的 iostream 实现可能不支持“开箱即用”的 UTF-16。这有点奇怪,因为这样做只会涉及通过未更改的数据,但大多数人仍然不支持它。对于它的价值,至少如果我没记错的话,C++ 0x 应该添加这个。

于 2010-03-17T17:09:09.480 回答
0

I am not sure, but you can try to call setlocale(LC_CTYPE, "");

于 2010-03-17T18:42:54.283 回答
0

默认情况下,Iostreams 假定磁盘上的任何数据都是非 unicode 格式,以便与不处理 unicode 的现有程序兼容。C++0x 将通过允许本机 unicode 支持来解决这个问题,但此时std::codecvt<wchar_t, char, mbstate_t>iostreams 使用一个用于将普通 char 数据转换为宽字符的方法。请参阅 cplusplus.com对 std::codecvt 的描述

如果您想将 unicode 与 iostreams 一起使用,您需要使用 form 指定一个 codecvt facet std::codecvt<wchar_t, wchar_t, mbstate_t>,它只是通过未更改的数据。

于 2010-03-17T17:41:31.543 回答