gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:01:38 26 4
gpt4 key购买 nike

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

感谢您的帮助!

最佳答案

如果您需要做的只是读写它,那么 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 窗口,UTF-32 适用于大多数 *nix 类操作系统))。最简单的方法是为流注入(inject)一个分面,该分面知道输入是 UTF-8 格式并将自动转换它。

在不同的库中有几个这样的方面。但一个容易找到的是提升:

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

注意。您应该在文件打开之前对其进行灌输。如果您在流打开后对其进行注入(inject),则流的不同实现会有不同的 react 。因此,最好在打开流之前对其进行灌注。

Dinkumware 还有一组转换方面(不确定是否免费)。
http://www.dinkumware.com/manuals/default.aspx?manual=compleat&page=index_cvt.html#Code%20Conversions

注意:我更喜欢使用术语 UTF-X 而不是 UCS-Y。尽管在技术上存在非常细微的差异,但与您在谈论该主题时在两个术语之间切换可能造成的混淆相比,这些差异是无关紧要的。坚持使用一个,除非您需要明确谈论某个功能(例如代理对)。

关于Unix/Mac OS X 上的 C++ UTF-8 支持,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5294014/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com