【问题标题】:How to read WCP-1252 characters in C++?如何在 C++ 中读取 WCP-1252 字符?
【发布时间】:2023-03-26 15:08:01
【问题描述】:

我在谷歌上搜索了一些,但找不到明确的答案(也许没有使用正确的术语?)

无论如何,我有一些 ANSI 格式 (WCP-1252) 的文本文件,我想在 C++ 程序中处理其字符,但问题是我不知道如何存储对应于十进制的 2 字节字符代码 128 到 255。不过为了确定,我尝试了以下代码:

ifstream infile("textfile.txt");
char c;
infile>>c;                           //also tried infile.get(c);  
cout<<c;

不出所料,1-byte char 未能存储 0x7F 之后扩展集中的任何符号(我认为它只是显示了与第一个字节的值相对应的 ASCII 符号并丢弃了第二个或反之亦然)。

【问题讨论】:

  • Reading 字符实际上并不是问题,但是您正在将它们转换为其他内容(并且“2 字节”建议使用 Unicode)。你是对的:你不能将一个 Unicode 字符存储到一个简单的字符中。请改用wchar。但是,cout 在高 ASCII 字符上失败是另一个(不相关的)问题。
  • 我虽然在文件中>>c;会捕获不可打印的内容,但将它们打印出来是另一回事。尝试cout&lt;&lt;int(c)&lt;&lt;" "; 以更有弹性地查看您正在阅读的内容。
  • 您确定文件中有两个字节字符吗?除非我感到困惑,否则 WCP-1252 只有 0-255 或单字节的字符。
  • 等一下问题编辑。 “第一个字节的值并丢弃第二个”——不可能。 Win-1252 指定一个 ASCII 代码页,所有值都是只有 1 个字符宽。
  • .. 将这段神秘文字的一小段粘贴到您的帖子中。我敢打赌它是 UTF8。

标签: c++ file-io ansi ifstream windows-1252


【解决方案1】:

WCP-1252 以 8 位表示,但某些字符不是 ASCII 的一部分。我建议你写一个从 WCP-1252 到 wchar_t 的转换表。逐字符读取字符并转换为 wchar_t。 你可以写一个map。例如:

wchar_t WCP1252Towc( char ch )
{
    static map< char, wchar_t > table
    {

        {0x30, L'0' },
        {0x31, L'1' },
        // ..
        {0x39, L'9'},

        {0x40, L'A'},
        // ...
        {0x5A, L'Z'},

        {0x61, L'a'},
        // ...
        {0x7A, L'z'},

        // ...
    };

    return table[ ch ]; 
};  

wstring WCP1252sTowcs( string str )
{
    const auto len = str.size();
    wstring res( len, L'\0' );

    for( size_t i = 0; i < len; ++i )
        res[ i ] = WCP1252Towc( str[ i ] );

    return res;
}

ifstream infile("textfile.txt");
string line; getline( infile, line );
auto unicode = WCP1252sTowcs( line );
wcout << unicode;

【讨论】:

  • 谢谢。我现在正在制作一张完整的地图,但是地图条目中角色前面的“L”是什么意思?
  • 因为你的一些 char WCP1252 不能用 char 类型表示。您需要使用 wchar_t,因此字符串之前的 L 会告诉编译器我们使用的是 wchar_t 而不是 char
  • wchar_t 是特定于实现的,保证能够存储 unicode 字符
  • 好的,我根据你的代码写了一个简短的代码:pastie.org/8535498 我正在使用它来读取一个文本文件,其中只存储了符号 é(因此地图中只有一个条目),但就像我在问题中的第一个代码一样,它只是在控制台中打印一个 8 。我做错了什么还是我的 Visual Studio 没有使用 WCP-1252 或其他什么? (我认为默认情况下会这样做)。
  • 我发现了一些有趣的事情:控制台应用程序很难打印非 ASCII 字符:看起来像这样:stackoverflow.com/questions/15473051/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-31
  • 1970-01-01
  • 2015-06-29
相关资源
最近更新 更多