【问题标题】:Issue about 65533 � in C# text file reading关于 C# 文本文件读取中的 65533 的问题
【发布时间】:2013-02-07 23:00:05
【问题描述】:

我创建了一个示例应用程序,用于在从 Openoffice 编写器复制粘贴到记事本时加载所有特殊字符。双码不同,当我尝试加载时。

var lines = File.ReadAllLines("..\\ter34.txt");

这会产生 65533 问题,文本文件包含:

这里已改为符号:

【问题讨论】:

  • 文本文件使用什么编码? ANSI? ASCII? UTF8? UTF16?
  • 问题只出现在 ANSI 中......其余的东西正常工作,它将其更改为 -- “ --
  • 只给那些可能不知道的人。 (char)65533 也称为 U+FFFD,是一个替换字符。当要转换的数据损坏或要转换的编码不能表示正确的字符时,通常会发出这种情况。见Wikipedia

标签: c# unicode


【解决方案1】:

U+FFFD 是“Unicode 替换字符”,如果您尝试读取的数据对于用于将二进制数据转换为文本的编码无效,则使用该字符。

例如,如果您使用 ISO-8859-1 写出一个文件,然后尝试使用 UTF-8 读取它,那么您很容易得到一些简单的字节序列'不是有效的 UTF-8。每个无效字节都会(默认)翻译成 U+FFFD。

基本上,您需要为File.ReadAllLines 提供正确的编码,作为第二个参数。当然,这意味着您首先需要知道文件的编码。

【讨论】:

  • 奇怪的是,我一直以为这只是自定义特征数据流/转码库。它是明确定义的 Unicode 转码行为吗?太好了!
  • 当我以 UTF8、Unicode ..etc 等格式保存 txt 文件时,它工作正常,但当我将其保存为 ANSI .. 时,该符号出现
  • Unicode 文件可以呈现许多不同的字符,而 ANSI - 依赖于选定的 CodePage,通常要少得多。当您尝试将某些“扩展”字符保存到 ANSI 文件时,您有可能无法将该字符转换为您选择(或默认为)的 ANSI 代码页。在这种情况下,可能会发生三件事:可能会引发异常并使一切崩溃,因此您会看到有问题,或者可能会静默跳过这些字符(eeviill),或者将某些“替换字符”写入文件,因此您会看到有问题
  • @user2046631:是的,所以当您读取文件时,您也需要指定该编码。 “ANSI”不是单一的编码 - 它是用于许多编码的广义术语。你需要找出你真正的意思。
  • @user2046631 如果文本文件是“Windows(西欧)”类型的 ANSI,您可以使用 File.ReadAllLines(@"..\ter34.txt", Encoding.GetEncoding("Windows-1252"))。要依赖您自己机器的 ANSI,请使用 File.ReadAllLines(@"..\ter34.txt", Encoding.Default)
猜你喜欢
  • 2012-10-23
  • 1970-01-01
  • 1970-01-01
  • 2019-07-01
  • 2013-11-20
  • 1970-01-01
  • 1970-01-01
  • 2011-09-28
相关资源
最近更新 更多