如何检查char在C ++中是否有效

时间:2013-06-07 01:09:44

标签: c++ optimization utf

我需要一个程序来读取文件的内容并将它们写入另一个文件,但只能写入有效的utf-8字符。问题是该文件可能采用任何编码方式,文件内容可能与此类编码相对应也可能不对应。

我知道这是一团糟,但这是我可以使用的数据。我需要“清理”的文件可以大到几TB,所以我需要程序尽可能高效。目前我正在使用我在python中编写的程序,但是需要一周的时间来清理100gb。

我正在考虑使用w_char函数读取字符,然后将它们作为整数进行管理,并丢弃所有不在某个范围内的数字。这是最佳解决方案吗?

在C / C ++中读写最有效的方法是什么?

编辑:问题不在于IO操作,问题的一部分旨在提供更快的程序的额外帮助,但真正的问题是如何快速识别非UTF字符。此外,我已经尝试过palatalization和RAM磁盘。

4 个答案:

答案 0 :(得分:1)

Utf8只是一种编码字符的好方法,并且具有非常清晰的结构,因此从根本上说,读取一块内存并验证它包含utf8是相当简单的。大多数情况下,这包括验证某些位模式不会发生,例如C0,C1,F5到FF。 (取决于职位)

在C语言中相当简单(对不起,不要说python)来编写一个简单的fopen / fread并检查每个字节的位模式,尽管我建议找一些代码来剪切/粘贴(例如{{ 3}}但我没有使用这些确切的例程)因为有一些警告和特殊情况要处理。只需将输入字节视为unsigned char并直接对其进行位掩码即可。我会粘贴我使用的,但不会在办公室。

C程序将迅速成为IO绑定,因此如果您想要最终性能,那么有关IO的建议将适用,但是如果您正确执行此操作,那么像这样的直接字节检查将难以在性能上超越。 Utf8很不错,即使你从文件中间开始也可以找到边界,所以这很好地适用于并行算法。

如果您自己构建,请注意可能会在某些文件的开头显示的BOM掩码。

链接

http://utfcpp.sourceforge.net/非常清晰的概述,表格显示了有效的位模式。

http://en.wikipedia.org/wiki/UTF-8描述utf8的rfc

http://tools.ietf.org/html/rfc3629主页为unicode consortitum。

答案 1 :(得分:0)

根据我的最佳选择是平行。如果您可以并行化清洁并同时清洁许多内容,那么该过程将更有效。我会研究一个并行化的框架,例如: mapreduce你可以在哪里多线程完成任务。

答案 2 :(得分:0)

我会查看内存映射文件。这是微软世界的事情,不确定它是否存在于unix等中,但可能会存在。

基本上你打开文件并将操作系统指向它并将文件(或其中的一大块)加载到内存中,然后可以使用指针数组进行访问。对于100 GB文件,您可以一次加载1GB,进程然后写入内存映射输出文件。

http://msdn.microsoft.com/en-us/library/windows/desktop/aa366556(v=vs.85).aspx

http://msdn.microsoft.com/en-us/library/windows/desktop/aa366542(v=vs.85).aspx

我认为这应该是执行大I / O的最快方法,但您需要进行测试才能确定。

HTH,祝你好运!

答案 3 :(得分:0)

Unix / Linux和任何其他符合POSIX标准的操作系统都支持内存映射(mmap)toow。