在我们的应用中,我们收到的文本文件(.txt,.csv从不同的来源,等等).在阅读时,这些文件有时会包含垃圾,因为文件是在不同的/未知的代码页中创建的.
有没有办法(自动)检测文本文件的代码页?
的detectEncodingFromByteOrderMarks,对StreamReader构造,工程UTF8 和其他的Unicode标文件,但是我正在寻找一种方法来检测代码页,像ibm850,windows1252.
谢谢你的回答,这就是我所做的.
我们收到的文件来自最终用户,他们没有关于代码页的线索.接收者也是最终用户,到目前为止,这是他们对代码页的了解:代码页存在,并且令人讨厌.
解:
有没有办法在C#中确定字符串的编码?
说,我有一个文件名字符串,但我不知道它是用Unicode UTF-16编码还是系统默认编码,我怎么知道呢?
是的是一个最常见的问题,这个问题对我来说很模糊,因为我对此并不了解.
但我想要一种非常精确的方法来查找文件编码.像Notepad ++一样精确.
我需要在80%确定文件是二进制文件还是文本文件,有没有办法在c#中快速,脏/丑?
我正在开发一个代码库,由于多个团队成员使用不同的编辑器(以及默认设置)进行开发,因此散布了一些unicode编码文件.我想通过查找所有unicode编码文件并将它们转换回ANSI编码来清理我们的代码库.
任何关于如何完成这项任务的"发现"部分的想法都将得到真正的体会.
我编写了一个小程序,用于迭代大量文件,并在找到某个字符串匹配时应用一些更改,我遇到的问题是不同的文件有不同的编码.所以我想做的是检查编码,然后用原始编码覆盖文件.
在C#.net 2.0中最漂亮的方式是什么?
我的代码现在看起来非常简单;
String f1 = File.ReadAllText(fileList[i]).ToLower();
if (f1.Contains(oPath))
{
f1 = f1.Replace(oPath, nPath);
File.WriteAllText(fileList[i], f1, Encoding.Unicode);
}
Run Code Online (Sandbox Code Playgroud)
我看了一下C#中的自动编码检测,这让我意识到我如何检测编码,但我不知道如何使用该信息以相同的编码进行编写.
非常感谢这里的任何帮助.
有没有办法在C#中确定字节数组的编码?
我有任何字符串,如 "LoremipsumáéíóúñÑç",我使用几种编码得到字节数组.
我想在字节数组中检测编码的唯一方法,我再次得到字符串值.
其他问题,也许,我会在数据库中有一个存储BLOB的列(如字节数组).以前转换为UTF-8字节数组的字符串.也许另一个应用程序使用Unicode编码将字符串转换为字节数组.
在数据库列中,有几个编码的字节数组.检测字节数组的编码非常有用.我需要一种方法来查找字节数组的编码.
测试:
string DataXmlForSupport = "<support><machinename></machinename><comments>Este es el log 1 áéíóú</comments></support>";
string DataXmlForSupport2 = "Lorem ipsum áéíóú ñÑç";
[TestMethod]
public void Encoding_byte_array_string()
{
var uencoding = new System.Text.UnicodeEncoding();
byte[] data = uencoding.GetBytes(DataXmlForSupport);
var dataXml = Encoding.Unicode.GetString(data);
Assert.AreEqual(DataXmlForSupport, dataXml, "Se esperaba resultados Unicode");
dataXml = Encoding.UTF8.GetString(data);
Assert.AreNotEqual(DataXmlForSupport, dataXml, "NO Se esperaba resultados UTF8");
var utf8 = new System.Text.UTF8Encoding();
data = utf8.GetBytes(DataXmlForSupport2);
dataXml = Encoding.UTF8.GetString(data);
Assert.AreEqual(DataXmlForSupport2, dataXml, "Se esperaba resultados UTF8");
dataXml = Encoding.Unicode.GetString(data);
Assert.AreNotEqual(DataXmlForSupport2, dataXml, …Run Code Online (Sandbox Code Playgroud) 各种字符编码的问题在于包含文件并不总是清楚地标记.使用"字节顺序标记"或BOM标记一些不一致的约定.但实质上,你必须被告知文件编码是什么,准确地读取它.
我们构建了读取源文件的编程工具,这让我们感到悲伤.我们有办法指定默认值,并嗅探BOM等.我们在常规和默认值方面做得很好.但是我们(我假设其他所有人)被挂起的地方是没有BOM标记的UTF-8文件.
最近的MS IDE(例如,VS Studio 2010)显然会"嗅探"文件以确定它是否是没有BOM的UTF-8编码.(从事工具业务,我们希望与MS兼容,因为他们的市场份额,即使这意味着必须与他们一起超越"愚蠢"的悬崖.)我特别感兴趣的是他们用作什么启发式(虽然启发式的讨论很好)?怎么会"正确"?(考虑以这种方式解释的ISO8859-x编码字符串).
编辑:关于检测字符编码/集的这篇论文非常有趣:http: //www-archive.mozilla.org/projects/intl/UniversalCharsetDetection.html
编辑2012年12月:我们结束扫描整个文件,看它是否包含任何违反UTF-8序列的行为......如果没有,我们称之为UTF-8.这个解决方案的不好的部分是你必须处理两次字符,如果它是UTF-8.(如果它不是UTF-8,这个测试可能会相当快地确定,除非文件发生在所有7位ASCII上,此时读取像UTF-8一样不会受到伤害).
我们所有基于文本的文件均采用 UTF-8 或 latin-1 (Windows) 编码。我们使用的唯一“特殊字符”是德语变音符号 \xc3\xa4、\xc3\xb6、\xc3\xbc 和 \xc3\x9f。
\n\n由于不同的原因(包括历史原因,也包括“属性文件不能是UTF-8”的老问题),我们无法完全统一我们的编码。
\n\n当人们用 Java 读取文本文件并使用错误的编码时,这显然会导致错误。
\n\n如果您知道唯一可能的特殊字符是上面指出的字符,是否有一种简单、可靠的方法来检测文件是 UTF-8 还是 latin-1。
\n\n或者我是否需要将文件读取为字节数组并搜索特殊字节?
\n我们在zip文件中编码文件时出现问题.我们使用离子拉链来压缩和解压缩档案.我们位于丹麦,所以我们经常在文件名中包含æ,ø或å的文件.
当用户使用Windows内置工具压缩文件时,我发现它正在使用IBM437 enconding,当我们在其中包含'ø'/'Ø'的文件时,这只是给出了一些时髦的结果.我修复了以下代码:
public static string IBM437Encode(this string text)
{
return text.Replace('ø', '¢').Replace('Ø', '¥');
}
public static string IBM437Decode(this string text)
{
return text.Replace('¢', 'ø').Replace('¥', 'Ø');
}
Run Code Online (Sandbox Code Playgroud)
这已经运行了一段时间了,一切都很好.
但是,因为它总是一个但是,我们没有尝试用mac osx中的默认工具压缩的文件.所以现在我们遇到了一个新问题..当使用æ,ø和å时,编码是UTF-8! 所以如果我知道压缩拉链的位置,我可以让它工作,但是有没有简单的方法来检测或规范化拉链内的编码?
之前我已经在Stack Overflow上以循环方式询问了这个问题,并希望这次能够做到正确.如何将ANSI(代码页1252)转换为UTF-8,同时保留特殊字符?(我知道UTF-8支持比ANSI更大的字符集,但是如果我可以保留ANSI支持的所有UTF-8字符并用其他?东西替换其余的字符集就可以了)
为什么我要转换ANSI→UTF-8
我基本上编写的程序将vCard文件(VCF)拆分为单个文件,每个文件包含一个联系人.我注意到诺基亚和索尼爱立信手机以UTF-8(无BOM)保存备份VCF文件,但Android将其保存为ANSI(1252).上帝知道其他手机以什么格式保存它们!
所以我的问题是
tl; dr 需要知道如何将字符编码从(ANSI/UTF8)转换为(UTF8/ANSI),同时保留所有特殊字符.
我想byte[]用C#读取文件的当前编码.
正如在MSDN中编写的那样,当构造函数没有编码时,默认编码将是UTF-8:
var reader = new StreamReader(new MemoryStream(data)).
Run Code Online (Sandbox Code Playgroud)
我也试过这个,但仍然把文件作为UTF-8:
var reader = new StreamReader(new MemoryStream(data),true)
Run Code Online (Sandbox Code Playgroud)
我需要byte[]用当前编码来阅读.