我正在尝试打开现有文件并阅读它,例如:
std::string text = fileOpenRead(readonly, filePath);
然后我想将string
的编码更改为UTF-8并保存。
所以,我需要两个API:
查找文件的现有编码。
将上述编码中的数据转换为UTF-8。
我搜索了Google和StackOverflow,但我找不到完美的解决方案。
有人可以和我分享一些提示吗?
答案 0 :(得分:1)
世界上使用了很多编码(Unicode旨在取代所有这些编码,但目标尚未达到100%全局),并且许多非ASCII编码无法准确地被检测到没有上下文,或者用于创建文件的编码的先验知识。除非您可以询问用户特定的编码,否则您将不得不求助于数据的启发式分析(如果您搜索,则会有一些第三方字符集检测库),并且在没有上下文信息的情况下容易出错。
见:
如果没有上下文,可以用不同的方式解释相同的数据,从而产生不同的结果。例如,这样的问题会影响"简单"作为Windows中的记事本,必须猜测文件的编码。这是猜测可能出错的一个很好的例子:
Some files come up strange in Notepad
The Notepad file encoding problem, redux
无论您的启发式方法有多好,您仍然在猜测,并且猜测并非100%可靠。所以请帮自己一个忙,根本不要猜测。
对于步骤2,一旦确定了源编码,就应该使用可移植的Unicode库将该编码转换为UTF-8,例如libiconv或ICU。
答案 1 :(得分:0)
对于指定其编码的特定文件,没有任何内容可以通用的方式适用于世界上的每个操作系统。
各个操作系统可以提供特定于文件的元数据,用于定义文件中的内容类型;就像编码文本文件一样。
但标准C ++库中没有任何内容可以返回任意文件的编码。