【问题标题】:write every possible char into a file将所有可能的字符写入文件
【发布时间】:2015-09-11 04:25:45
【问题描述】:

我想将存在的每个字符写入文件。我猜 unicode 有最完整的字符集,但我不太清楚。你能帮我解决这个问题吗?我正在使用 C++。这段代码似乎“只”写了 ASCII 字符集(或者我错了吗?)。感谢您的帮助。

#include <iostream>
#include <fstream>

using namespace std;

int main(void) {

wofstream wOutStream;
wOutStream.open("myFile.txt");

wchar_t myChar = 0;
do {
    wOutStream << myChar << " ";
    myChar++;
} while (myChar != 0);

wOutStream.close();

cin.get();
return 0;
}

【问题讨论】:

  • 您不能只增加字符并希望它成功地遍历整个 UNICODE 字符空间。实际上有数十亿个可能的字符,但only a fraction are allocated.
  • Unicode 字符需要遵循某些位模式,如前所述,只有一小部分适合的可能数字。
  • 好的,但是你能解释一下这样做的方法吗?
  • @KilianHe 最好的方法是获取一个 Unicode 数据库,它会告诉您定义了哪些字符,尽管它可能会过时。
  • @tadman,不是十亿...U+0000 到 U+10FFFF 可能是 1,114,112,但并非全部都已分配。

标签: c++ unicode char fstream


【解决方案1】:

这是一个相当开放的问题,确切的答案取决于你的雄心壮志。所以我就不贴程序了,只列出基本步骤:

  • Unicode 将字符分配给数字(称为代码点),例如“A”分配给 nr 65,通常以十六进制写为 U+0041。它还定义了名称和许多其他属性。例如“A”被称为“LATIN CAPITAL LETTER A”,它的小写版本是“a”,它是从左到右语言的一部分等等。

  • 但它自己指定如何将该字符写入文件。为此,您必须选择一种编码。常见的编码是 UTF-8,应该很容易找到将代码点编码为字节的代码。如果你打开你的文本文件,那么你的编辑器也需要理解这种编码(对于 UTF-8 应该不是问题)。

  • 特别是对于 C++,在编写 UTF-8 时,我会打开一个窄输出流 (std::ofstream) 并写入字节。 C++ 原则上不支持编写 Unicode 文件。您的程序大致如下所示。

    for (unsigned int codePoint = 0; codePoint < 0x110000; ++codePoint)
    {
        std::string utf8 = encode_utf8(codePoint);
        outStream << utf8 << " ";
    }
    

    也许每 256 个字符左右添加一个换行符。

  • 有 2^16 个代码点的 17 个平面。许多常用字符都在第一个平面中。您可以仅打印第一个平面(U+0000 到 U+FFFF),也可以打印所有代码点(U+0000 到 U+10FFFF)。有些位面还没有指定角色。

  • 您只想打印分配的代码点吗?在这种情况下,您必须从 Unicode 联盟下载列表并对其进行解析。没有产生分配代码点的公式。或者正如其他人指出的那样,您可以使用内置这些表的语言,例如 Python 或 Java。

  • 最后,一些范围保留给私人使用。您也可以选择跳过这些。

【讨论】:

  • 非常感谢!似乎 C++ 对这项任务来说不是一个糟糕的选择?未分配的代码点会是什么样子?如果它是一个空字符串,我可以在将其写入文件之前对其进行检查。当我尝试访问范围内的某些内容以供私人使用时会发生什么?
  • 对 Unicode 是什么做一些研究可能是个好主意。 C++ 很好,但它会做更多的工作。未分配的代码点和私人使用字符可能会显示为无效字符,具体取决于您显示文件的方式。例如, 在私人使用块中,͸ 未分配。
猜你喜欢
  • 2018-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-31
  • 2011-10-24
相关资源
最近更新 更多