Encoding 如何在.NET中确定文件是UCS-2还是UTF-16

Encoding 如何在.NET中确定文件是UCS-2还是UTF-16,encoding,utf-16,ucs2,Encoding,Utf 16,Ucs2,我有平面文件,可以在UTF-16的.NET中很好地加载,即使它们在技术上是UCS2-LE(没有BOM),我理解这是因为UCS-2是UTF-16取代的较旧标准 然而,我感兴趣的是能够确定一个文件是否真的是UCS-2。我知道这意味着我在猜测。我曾尝试过chardet的.NET端口、IMultilang2 interop以及Novell的一些开放源码,试图梳理出UCS-2优于UTF-16的决定,但没有取得任何成功。我还没有找到任何技术可以确定UCS-2LE不带BOM和无效/过长UTF-8之间的差异 我

我有平面文件,可以在UTF-16的.NET中很好地加载,即使它们在技术上是UCS2-LE(没有BOM),我理解这是因为UCS-2是UTF-16取代的较旧标准

然而,我感兴趣的是能够确定一个文件是否真的是UCS-2。我知道这意味着我在猜测。我曾尝试过chardet的.NET端口、IMultilang2 interop以及Novell的一些开放源码,试图梳理出UCS-2优于UTF-16的决定,但没有取得任何成功。我还没有找到任何技术可以确定UCS-2LE不带BOM和无效/过长UTF-8之间的差异


我应该逐个字节地检查它们,并尝试确定它是可变长度编码还是固定长度编码?也许可以寻找丢失的代码点?问题是这些文本文件没有特殊的代码点,它们只有bog标准西方字符集。但是TextPad将它们保存为UCS2-LE w/o BOM,这使我们的软件中的下游文件操作变得复杂,因为我们希望它们完全符合UTF-16(并且只需强制加载文件即可,但无法满足软件的要求)。

本维基百科文章部分, 介绍基本的多语言平面BMP。对于UTF-16和UCS-2,BMP中的所有代码点都是相同的。如果TextPad只是对BMP进行编码,则可以将文档视为UTF-16或UCS-2

当BMP之外的代码点被编码时,问题就出现了UCS-2不能表示BMP之外的代码点。 这将导致人们假设,如果代码点在BMP之外,那么它可以在UTF-16处处理。如果创建文件的程序不正确地执行UCS-2,并且出于辅助原因在BMP之外使用代码点,则可能会出现问题


大多数读取UTF的库和程序都允许您在每个字符的基础上指定编码错误发生时要执行的操作(引发异常、替换为占位符、简单地忽略)。如果将不正确的UCS-2文件作为UTF-16在其中一个文件中运行,则会引发错误。理解文件作者试图在BMP之外执行的操作是正确处理它们的唯一方法。

这可能会有所帮助:引用:在解释人们在过去使用“UCS-2”时,最好不要将其视为数据格式,但作为一种指示,实现不会解释任何补充字符。特别是,为了数据交换的目的,UCS-2和UTF-16是相同的格式。两者都是16位的,并且具有完全相同的代码单元表示;我可以使用现有的启发式方法来检测UTF-16,但这些实现无法找出不带BOM文件的UCS-2LE。我想对它们一视同仁,但我最终不得不使用回退编码,因为我找不到确定差异的方法。这完全正确,但我无法使用chardet的.NET端口、IMultiLang2等工具在没有BOM的情况下猜测任何UCS-2LE文件的UTF-16。TextPad只是存储BMP,这是正确的,但我无法让我的软件以防弹的方式解决这个问题。但是,这基本上就是答案,在这些情况下,我可以遍历文件并确定代码点是否在BMP中。我不喜欢的部分是,在没有BOM的情况下,我找不到一个可以自己猜测的启发式方法。