如何查找和更改现有文件的编码?

时间:2016-07-07 00:55:57

标签: c++ encoding

我正在尝试打开现有文件并阅读它,例如:

std::string text = fileOpenRead(readonly, filePath);

然后我想将string的编码更改为UTF-8并保存。

所以,我需要两个API:

  1. 查找文件的现有编码。

  2. 将上述编码中的数据转换为UTF-8。

  3. 我搜索了Google和StackOverflow,但我找不到完美的解决方案。

    有人可以和我分享一些提示吗?

2 个答案:

答案 0 :(得分:1)

如果文件尚未使用UTF编码(如UTF-8或UTF-16(UTF-8非常容易检测)和UTF-,则步骤#1非常难以完成 如果BOM不存在,16在某种程度上也相当容易。)

世界上使用了很多编码(Unicode旨在取代所有这些编码,但目标尚未达到100%全局),并且许多非ASCII编码无法准确地被检测到没有上下文,或者用于创建文件的编码的先验知识。除非您可以询问用户特定的编码,否则您将不得不求助于数据的启发式分析(如果您搜索,则会有一些第三方字符集检测库),并且在没有上下文信息的情况下容易出错。

见:

The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)

如果没有上下文,可以用不同的方式解释相同的数据,从而产生不同的结果。例如,这样的问题会影响"简单"作为Windows中的记事本,必须猜测文件的编码。这是猜测可能出错的一个很好的例子:

Notepad bug? Encoding issue?

Some files come up strange in Notepad

The Notepad file encoding problem, redux

Bush hid the facts

无论您的启发式方法有多好,您仍然在猜测,并且猜测并非100%可靠。所以请帮自己一个忙,根本不要猜测

对于步骤2,一旦确定了源编码,就应该使用可移植的Unicode库将该编码转换为UTF-8,例如libiconvICU

答案 1 :(得分:0)

对于指定其编码的特定文件,没有任何内容可以通用的方式适用于世界上的每个操作系统。

各个操作系统可以提供特定于文件的元数据,用于定义文件中的内容类型;就像编码文本文件一样。

但标准C ++库中没有任何内容可以返回任意文件的编码。