c++ - 使用 fopen 读取 C++ 中的文本文件,无需换行转换

标签 c++ string utf-8 fopen linefeed

我在 Windows 上处理文本文件 (UTF-8) 并想使用 C++ 读取它们。

要正确打开文件,我使用 fopen .如所述here , 有两个打开文件的选项:

  • 文本模式“rt”(回车+换行会自动转换为换行;短“\r\n”变为“\n”)。
  • 二进制模式“rb”(文件将逐字节读取)。

现在变得棘手了。我不想以二进制模式打开文件,因为我会失去对我的 UTF-8 字符的正确处理(并且我的文本文件中有特殊字符,当被解释为 ANSI 字符时会损坏)。但我也不希望 fopen 将我所有的 CR+LF 转换为 LF。

有没有办法结合这两种模式,将文本文件读入字符串而不篡改换行符,同时仍然能够正确读取 UTF-8?

我知道,如果我通过同一个文件写入它,则会发生反向转换,但字符串会发送到另一个需要 Windows 样式行尾的应用程序。

最佳答案

在文本模式和二进制模式下打开文件之间的区别完全在文本模式下处理行结束序列或在二进制模式下不接触它们。仅此而已。由于 ASCII 字符在 Unicode 中使用相同的代码点,而 UTF-8 保留了 ASCII 字符的编码(即每个 ASCII 文件恰好是 UTF-8 编码的 Unicode 文件)无论您使用二进制还是文本模式都不会影响其他字节。

可能值得看看 James McNellis "Unicode in C++"在 C++Now 2014 上的演讲。

关于c++ - 使用 fopen 读取 C++ 中的文本文件,无需换行转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27530636/

相关文章:

java - 如何从字符串生成Java源代码?

android - 如何将 utf-16 字符放入 Android 字符串资源中?

c++ - 获取 Win32 系统上的最大可寻址内存空间

c++ - curl 没有正确超时

string - 有没有办法有条件地 `fmt` 一个字符串?

c# - 如何检查字符串是否包含 List<string> 的任何元素?

iphone - 来自编码未知的文本文件的 NSString

symfony - 使用 PHP Unit 测试特殊字符

c++ - 为什么这些函数会截断返回值?

c++ - 如何在类似于 C 的 C++ 中打印 float