我需要一种能够从UTF-8编码文件中读取并将数据存储到C ++中的某种“UTF-8兼容字符串”的方法。此数据需要稍后写回UTF-8编码文件。关于在Windows中执行此操作似乎有很多关于谷歌的建议,但我找不到任何有关Unix系统的帮助。
感谢您的帮助!
答案 0 :(得分:0)
如果您只需要读取和写入它,那么std :: string就可以了。
std::ifstream fileIn("file.utf8");
std::string line;
std::getline(fileIn, line); // Reads a UTF-8 line
std::ofstream fileOut("OutFile.utf8");
fileOut << line; // Writes a line of UTF-8 text
这是有效的,因为没有多字符UTF代码点与ASCII字符重叠,因此文本的标准处理与行结束序列相关的工作正常,并且流不进行其他处理。你读的是你得到的。输出字符串不会改变任何代码点。
现在,如果您需要操纵不同问题的文本并使其更复杂。
通常操纵UTF-8是很难的方法(可以做但不值得IMO)。
当涉及到操作要将UTF-8(不是固定宽度)转换为内部固定宽度格式的文本时; (UTF-16或UTF-32是操作和易于使用的常见格式;(UTF-16窗口,大多数* nix的UTF-32,如OS))。最简单的方法是使用一个知道输入为UTF-8的facet为流添加流,并自动转换它。
在不同的库中有几个这样的方面。但一个容易找到的是提升:
http://www.boost.org/doc/libs/1_38_0/libs/serialization/doc/codecvt.html
注意:它也是最新版本的boost 1.46
std::locale old_locale;
std::locale utf8_locale(old_locale,new utf8_codecvt_facet<ucs4_t>);
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The important bit
// Note here we are converting to UTF-32(UCS-4)
std::wifstream fileIn;
fileIn.imbue(utf8_locale); // Imbue the stream with the knowledge.
fileIn.open("file.utf8");
// Now read wide characters from the stream. The UTF-8 file is converted
// into UTF-16/UTF-32 for internal processing.
std::wstring wideLine;
std::getline(fileIn, wideLine); // Read a line converting to UTF-16/32
将UTF-16/32写回流并将其转换为UTF-8的过程相同
std::wofstream fileOut;
fileOut.imbue(utf8_locale);
fileOut.open("OutFile.utf8");
fileOut << wideLine; // Write a UTF-16/32 line and convert into UTF-8
请注意。您应该在打开文件之前填充该文件。如果您在流打开后灌注流,则流的不同实现会有不同的反应。因此,最好在打开之前灌注流。
Dinkumware还有一组转换方面(不确定它们是否免费) http://www.dinkumware.com/manuals/default.aspx?manual=compleat&page=index_cvt.html#Code%20Conversions
注意:我更喜欢使用术语UTF-X而不是UCS-Y。虽然技术上存在非常微小的差异,但与通过在谈论主题时在两个术语之间切换而产生的混淆相比,这些是无关紧要的。坚持一个,除非你需要明确谈论一个功能(如代理对)。