2009-06-18 47 views
1

我读过一些有关读取Unicode文件等的答案,大多数人都指向UTF8-CPP或iconv。C++文件读取库 - ANSI和Unicode

我找到的库都不适用于ANSI和Unicode文件,理想情况下我想要一个函数,我传递一个文件名,它将返回该文件的内容,并且编码是什么并不重要,或者这是不可能的?

如果有的话,我会怎么做呢?

+0

圣杯100%保证自动检测文件编码是不可能的。有算法猜测,但他们是不是100%可靠。 – 2009-06-18 16:08:05

回答

2

那么,这是一个二进制读取不是?所有其他形式是解释的问题,然后确切的编码等变得重要。

虽然由于BOM,在某些情况下unicode可以被自动检测,但并不总是存在,并且失败的检测机制等于一个破损的程序。我认为这就是为什么大多数人不会这样做的原因。

+0

也许他指的Unicode文件名.. – 2009-06-18 12:33:42

0

如果您使用的是宽字符串,UTF8-CPP可以检测UTF8(utf8 :: is_valid和utf8 :: find_invalid)并执行转换(utf8 :: utf16to8)。它很好,问题是什么?

0

您可以使用多种技术的组合:

一般来说,大多数Unicode文件开始与BOM。如果文件与0xfffe开始或0xfeff可能认为它是Unicode的意思。很少有人使用UTF-32 AFAIK,但您仍然可以使用BOM方法进行猜测(请参阅Wiki页面)。

如果是UTF-8文件,可以使用UTF8-CPP将其转换为UTF-16(wstring)。如果它是一个UTF-16文件,使用标准库可能会很难阅读。对于taht,你可以参考我的博客文章:

http://cfc.kizzx2.com/index.php/reading-a-unicode-utf16-file-in-windows-c/

对于UTF-32 - 如果有人使用它,我不知道,所以我没有经验:P