我收到了一些编码的文本,但我不知道使用了什么字符集.有没有办法使用Python确定文本文件的编码?如何检测文本文件的编码/代码页处理C#.
这不是一个真正的编程问题,是否有命令行或Windows工具(Windows 7)来获取文本文件的当前编码?当然我可以写一个小C#应用程序,但我想知道是否有内置的东西?
参考以下线程: Java App:无法正确读取iso-8859-1编码文件
以编程方式确定输入流/文件的正确字符集编码的最佳方法是什么?
我尝试过使用以下内容:
File in = new File(args[0]);
InputStreamReader r = new InputStreamReader(new FileInputStream(in));
System.out.println(r.getEncoding());
Run Code Online (Sandbox Code Playgroud)
但是在我知道用ISO8859_1编码的文件中,上面的代码产生了ASCII,这是不正确的,并且不允许我正确地将文件的内容呈现回控制台.
我尝试检测我的文件中使用了哪个字符编码.
我尝试使用此代码来获取标准编码
public static Encoding GetFileEncoding(string srcFile)
{
// *** Use Default of Encoding.Default (Ansi CodePage)
Encoding enc = Encoding.Default;
// *** Detect byte order mark if any - otherwise assume default
byte[] buffer = new byte[5];
FileStream file = new FileStream(srcFile, FileMode.Open);
file.Read(buffer, 0, 5);
file.Close();
if (buffer[0] == 0xef && buffer[1] == 0xbb && buffer[2] == 0xbf)
enc = Encoding.UTF8;
else if (buffer[0] == 0xfe && buffer[1] == 0xff)
enc = Encoding.Unicode;
else if (buffer[0] == 0 && …Run Code Online (Sandbox Code Playgroud) 我有一个字符串,我想知道它内部是否有unicode字符.(如果它完全包含ASCII或不包含ASCII)
我怎样才能做到这一点?
谢谢!
我无法读到我试过的那些特殊字符
第一种方式#
string xmlFile = File.ReadAllText(fileName);
Run Code Online (Sandbox Code Playgroud)
第二种方式#
FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);
StreamReader r = new StreamReader(fs);
string s = r.ReadToEnd();
Run Code Online (Sandbox Code Playgroud)
但是这两个陈述都不理解那些特殊字符.我该怎么读?
更新###
我也尝试所有编码
string xmlFile = File.ReadAllText(fileName, Encoding. );
Run Code Online (Sandbox Code Playgroud)
但仍然不明白那些特殊的人物.
我需要确定文本文件的内容是否等于这些文本编码之一:
System.Text.Encoding.ASCII
System.Text.Encoding.BigEndianUnicode ' UTF-L 16
System.Text.Encoding.Default ' ANSI
System.Text.Encoding.Unicode ' UTF16
System.Text.Encoding.UTF32
System.Text.Encoding.UTF7
System.Text.Encoding.UTF8
Run Code Online (Sandbox Code Playgroud)
我不知道如何读取文件的字节标记,我已经看到片段这样做,但只能确定文件是ASCII还是Unicode,因此我需要更通用的东西.
我有一个 UTF8 文件,我已将其添加到 Resources.resx 中的项目中,名为 Template.txt
如果我像这样正常读取文件:
string template = File.ReadAllText(@"filepath\Template.txt", Encoding.UTF8);
Run Code Online (Sandbox Code Playgroud)
一切正常。
但是,如果我这样读:
string template = Properties.Resources.Template
Run Code Online (Sandbox Code Playgroud)
它充满了日文字符,因此编码错误。
byte[] bytes = Encoding.Default.GetBytes(Properties.Resources.Template);
string template = Encoding.UTF8.GetString(bytes);
Run Code Online (Sandbox Code Playgroud)
这也仍然给出了日语字符。
有谁知道原因?如果我只是在 Visual Studio 中双击 Template.txt 文件,我也可以正常读取它。
背景
我正在开发一个简单的 Windows 服务,它监视某些目录的文件创建事件并记录这些事件 - 长话短说,以确定文件是否从目录 A复制到目录 B。如果 X 时间后文件不在目录 B 中,将发出警报。
问题是我只有在确定文件是否已进入目录 B 时才能继续获取信息 - 我假设两个具有相同名称的文件是相同的,但是因为有超过 60 个目录 A和单个目录 B - 并且任何目录 A 中的文件可能会意外地与另一个目录相同(按日期或顺序),这不是一个安全的假设......
例子
假设,例如,我在目录 C:\Test 中存储了一个文件“E17999_XXX_2111.txt”的日志。我将存储此文件的文件名、文件路径、文件创建日期、文件长度和 BOM。
30 秒后,我检测到在目录 C:\FinalDestination 中创建了文件“E17999_XXX_2111.txt”...现在我有确定是否的任务;
a) 该文件与在 C:\Test 中创建的文件相同,因此我可以将第一个日志更新为完整并且不再担心它。
b)文件不一样,我不知何故错过了前面的步骤 - 因此我可以忽略这个文件,因为它已经找到了通往目标目录的路。
研究
因此,为了确定在目标中创建的文件是否与在第一个实例中创建的文件完全相同,我进行了一些研究并找到了以下选项:
a) 文件名比较
b) 长度比较
c) 创建日期比较
d) 逐字节比较
e) 哈希比较
问题
a) 正如我上面所说,单独使用文件名太冒昧了。
b) 同样,仅仅因为文件内容的长度相同,并不一定意味着文件实际上相同。
c) 问题在于复制的文件在技术上是一个新文件,因此创建日期会发生变化。无论出现在目录 A 和目录 B 中的文件之间经过的时间如何,我都希望将第一个日志设置为完整。
d) 除了这种方法非常慢这一事实之外,如果第二个文件以某种方式改变了编码,似乎还有一个问题——例如在 ANSII 和 ASCII 之间,这会导致像 ascii 引号这样的东西的字节不匹配
我不想假设仅仅因为 ASCII ' 已更改为 …
我有一个非常简单的 C# 程序,它迭代多个文件并替换所有文件中的字符串。
然而,当我使用 Git 比较这些文件时,它突出显示了我所有文件的更改。
我的 C# 代码是:
string[] files = Directory.GetFiles(path, "*", SearchOption.AllDirectories);
foreach (string file in files)
{
string fileText = File.ReadAllText(fileName, Encoding.UTF8);
string newText = fileText.Replace("hello", "goodbye");
File.WriteAllText(fileName, newText, Encoding.UTF8);
}
Run Code Online (Sandbox Code Playgroud)
就我而言,这看起来不错。但是,当我运行该程序并git status在存储库上执行时,我发现每个文件都有差异。
使用 Github Desktop 或 SourceTree 等程序会带来以下变化:
Github 桌面
源树
感谢您提供任何人可能有的提示或想法。他们非常感激。:)
StreamReader.ReadToEnd()? (一个)
Dim strWebResponse As String
Dim Request As HttpWebRequest = WebRequest.Create(Url)
Using Response As WebResponse = smsRequest.GetResponse()
Using reader As StreamReader = New StreamReader(Response.GetResponseStream())
strWebResponse = reader.ReadToEnd()
End Using
End Using
Run Code Online (Sandbox Code Playgroud)
(b)中
Dim encoding As New UTF8Encoding()
Dim strWebResponse As String
Dim Request As HttpWebRequest = WebRequest.Create(Url)
Using Response As WebResponse = Request.GetResponse()
Dim responseBuffer(Response.ContentLength - 1) As Byte
Response.GetResponseStream().Read(responseBuffer, 0, Response.ContentLength - 1)
strWebResponse = encoding.GetString(responseBuffer)
End Using
Run Code Online (Sandbox Code Playgroud) 我有一组markdown文件要传递给jekyll项目,需要找到它们的编码格式,即使用程序或API的带有BOM的UTF-8或没有BOM或ANSI的UTF-8。
如果我通过文件的位置,则必须列出文件,读取并作为结果产生编码。
是否有任何代码或API?
我已经尝试了有效方法中提到的用于流阅读器的sr.CurrentEncoding来找到任何文件的Encoding,但是结果随notepad ++结果的不同而不同。
还试图用https://github.com/errepi/ude(Mozilla的通用字符检测器),如建议https://social.msdn.microsoft.com/Forums/vstudio/en-US/862e3342-cc88-478f- bca2-e2de6f60d2fb / detect-encoding-of-file?forum = csharpgeneral,方法是在c#项目中实施ude.dll,但结果不如notepad ++那样有效,文件编码显示为utf-8,但从程序,结果是带有BOM的utf-8。
但是我应该从两种方法都得到相同的结果,那么问题出在哪里呢?