Unix / Mac OS X上的C ++ UTF-8支持

时间:2011-03-14 02:02:29

标签: c++ macos unix encoding utf-8

我需要一种能够从UTF-8编码文件中读取并将数据存储到C ++中的某种“UTF-8兼容字符串”的方法。此数据需要稍后写回UTF-8编码文件。关于在Windows中执行此操作似乎有很多关于谷歌的建议,但我找不到任何有关Unix系统的帮助。

感谢您的帮助!

1 个答案:

答案 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。虽然技术上存在非常微小的差异,但与通过在谈论主题时在两个术语之间切换而产生的混淆相比,这些是无关紧要的。坚持一个,除非你需要明确谈论一个功能(如代理对)。