如何可靠地猜测 MacRoman、CP1252、Latin1、UTF-8 和 ASCII 之间的编码 [重复]

2023-12-06

在工作中,似乎每周都会遇到一些与编码相关的忧虑、灾难或灾难。该问题通常源于程序员认为他们可以在不指定编码的情况下可靠地处理“文本”文件。但你不能。

因此决定从今以后禁止文件名以以下结尾*.txt or *.text。人们的想法是,这些扩展会误导临时程序员对编码感到沉闷的自满,从而导致不正确的处理。最好没有 根本没有扩展,因为至少你know你不知道自己拥有什么。

然而,我们不会走那么远。相反,您将需要使用以编码结尾的文件名。例如,对于文本文件,这些将类似于README.ascii, README.latin1, README.utf8, etc.

对于需要特定扩展名的文件,如果可以在文件本身内部指定编码(例如 Perl 或 Python),那么您应该这样做。对于像 Java 源代码这样的文件内部不存在此类工具的文件,您将把编码放在扩展名之前,例如SomeClass-utf8.java.

对于输出,UTF-8 是strongly首选。

但对于输入,我们需要弄清楚如何处理代码库中名为的数千个文件*.txt。我们想重新命名它们以适应我们的新标准。但我们不可能目击所有这些。所以我们需要一个真正有效的库或程序。

这些格式有多种:ASCII、ISO-8859-1、UTF-8、Microsoft CP1252 或 Apple MacRoman。尽管我们知道我们可以判断某些内容是否是 ASCII,并且我们可以很好地了解某些内容是否可能是 UTF-8,但我们对 8 位编码感到困惑。因为我们在混合 Unix 环境(Solaris、Linux、Darwin)中运行,并且大多数桌面都是 Mac,所以我们有很多烦人的 MacRoman 文件。这些尤其是一个问题。

一段时间以来,我一直在寻找一种方法来以编程方式确定哪些

  1. ASCII
  2. ISO-8859-1
  3. CP1252
  4. MacRoman
  5. UTF-8

文件存在,但我还没有找到可以可靠地区分这三种不同 8 位编码的程序或库。仅我们可能就有一千多个 MacRoman 文件,因此无论我们使用什么字符集检测器都必须能够嗅出这些文件。我所见过的任何东西都无法解决这个问题。我对ICU 字符集检测器库,但它无法处理 MacRoman。我还研究过在 Perl 和 Python 中执行相同操作的模块,但一次又一次总是同样的情况:不支持检测 MacRoman。

因此,我正在寻找一个现有的库或程序,能够可靠地确定文件采用这五种编码中的哪一种,最好不止于此。特别是它必须区分我引用的三个 3 位编码,特别是麦克罗曼。文件99%以上是英文文本;其他语言也有一些,但不多。

如果是库代码,我们的语言偏好是 Perl、C、Java 或 Python,并按此顺序。如果它只是一个程序,那么我们并不关心它是用什么语言编写的,只要它有完整的源代码、在 Unix 上运行并且完全不受阻碍即可。

还有其他人遇到过无数遗留文本文件随机编码的问题吗?如果是这样,您是如何尝试解决这个问题的?您的成功程度如何?这是我的问题最重要的方面,但我也想知道您是否认为鼓励程序员使用这些文件的实际编码来命名(或重命名)他们的文件将有助于我们避免将来的问题。有没有人尝试过在制度上强制执行这一点,如果是的话,是that成功与否,为什么?

是的,我完全理解为什么鉴于问题的性质不能保证得到明确的答案。对于小文件尤其如此,因为您没有足够的数据来继续处理。幸运的是,我们的文件很少很小。除了随机README文件的大小大多数在 50k 到 250k 之间,并且许多更大。任何大小超过几 K 的内容都保证是英文的。

问题领域是生物医学文本挖掘,因此我们有时会处理广泛且极其庞大的语料库,例如 PubMedCentral 的所有开放访问存储库。 BioThesaurus 6.0 是一个相当大的文件,有 5.7 GB。这个文件特别烦人,因为它是almost全部为 UTF-8。然而,一些笨蛋在其中插入了一些采用 8 位编码的行——我相信是 Microsoft CP1252。你需要相当长的一段时间才会被那个绊倒。 :(


首先,简单的情况:

ASCII

如果您的数据不包含 0x7F 以上的字节,则它是 ASCII。 (或者 7 位 ISO646 编码,但这些都已经过时了。)

UTF-8

如果您的数据验证为 UTF-8,那么您可以放心地假设它isUTF-8。由于 UTF-8 严格的验证规则,误报极为罕见。

ISO-8859-1 与 windows-1252

这两种编码之间的唯一区别是 ISO-8859-1 具有 C1 控制字符,而 windows-1252 具有可打印字符 €‚f„...†‡ˆ‰Š´ŒŽ''“”•–—~™š› œžŸ。我见过很多使用大引号或破折号的文件,但没有一个使用 C1 控制字符。因此,不必理会它们或 ISO-8859-1,只需检测 windows-1252 即可。

现在只剩下一个问题了。

如何区分 MacRoman 和 cp1252?

这要棘手得多。

未定义的字符

windows-1252 中不使用字节 0x81、0x8D、0x8F、0x90、0x9D。如果发生,则假设数据是 MacRoman。

相同的字符

字节 0xA2 (¢)、0xA3 (£)、0xA9 (©)、0xB1 (±)、0xB5 (µ) 在两种编码中恰好相同。如果这些是唯一的非 ASCII 字节,那么选择 MacRoman 还是 cp1252 都没有关系。

统计方法

计算您知道为 UTF-8 的数据中的字符(不是字节!)频率。确定最常见的字符。然后使用此数据来确定 cp1252 或 MacRoman 字符是否更常见。

例如,在我刚刚对 100 篇随机英语维基百科文章进行的搜索中,最常见的非 ASCII 字符是·•–é°®’èö—。基于这个事实,

  • 字节 0x92、0x95、0x96、0x97、0xAE、0xB0、0xB7、0xE8、0xE9 或 0xF6 表示 windows-1252。
  • 字节 0x8E、0x8F、0x9A、0xA1、0xA5、0xA8、0xD0、0xD1、0xD5 或 0xE1 表示 MacRoman。

计算 cp1252 建议字节和 MacRoman 建议字节,然后选择最大的一个。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何可靠地猜测 MacRoman、CP1252、Latin1、UTF-8 和 ASCII 之间的编码 [重复] 的相关文章

随机推荐

  • 我的 R.java 文件中的错误无法解决

    我正在使用 Eclipse ADT 捆绑包 最近更新了我的 Android SDK 工具和 Android SDK 平台工具 然后我尝试创建一个新项目 但我的 R java 文件中不断出现错误 这似乎微不足道 但我仍然不明白它是如何保持的显
  • HTML div 高度在窗口调整大小事件中不断增长

    我有简单的 Three js 场景 画布 我想在窗口调整大小事件时做出响应 特别是屏幕宽度的变化 保持高度恒定 在正常情况下我使用window innerWidth window innerHeight属性设置画布的大小以匹配窗口大小 不过
  • 如何计算随机森林的OOB?

    我正在比较一些模型以获得最佳模型 现在 我想要获得随机森林模型的 OOB 误差 以将其与其他一些模型的交叉验证误差进行比较 我可以做一下比较吗 如果可以的话 如何通过 R 代码获取 OOB 错误 要获取 R 中随机森林模型的 OOB 您可以
  • 无法将网络摄像头视频路由到 Linux 上的虚拟视频设备(通过 OpenCV)

    我想通过 OpenCV 将视频叠加到传入的网络摄像头流上 作为第一步 我尝试从网络摄像头传输传入的视频 dev video0到虚拟视频设备 dev video1 v4l2环回 不幸的是 我无法将网络摄像头流转发到 v4l2loopback
  • 如何自动将合约程序集包含在 nupkg 中?

    我刚刚开始使用 nuget 为我们公司的内部库创建一些包 该库由许多程序集组成 其中许多具有从代码合同生成的合同引用程序集 我用的是最简单的nuget pack方法 就是传入csproj文件路径 让它解析项目之间的所有依赖关系 问题是它不包
  • WPF:“ApplicationCommands.New”在 MenuItem 的情况下显示不正确的源

    我是 WPF 新手 正在查看 net 4 5 中的 Professional WPF 示例 在命令章节中 有一个示例 多个控件可以发送相同的命令 我使用按钮 复选框和菜单项来触发 新建 命令 我面临的问题是 如果第一次按下 MenuItem
  • 从 javascript 对象数组中删除一些属性

    我想从 javascript 对象数组中删除一些属性 这是对象数组 obj array DATA ID 1 DATA NAME Jim DATA BB TYP 2 DATA MAC 5474 DATA ID 3 DATA NAME Fro
  • 如何使用默认 R 安装通过 conda 安装 rpy2

    我在 Ubuntu Linux 上使用 Anaconda Python 发行版 并希望在 IPython 笔记本中使用 R 魔法 有没有办法使用 conda 发行版安装 rpy2 并使用我当前在 usr bin R 的默认 R 安装 我的目
  • codeigniter 在 find_in_set 中添加 IS NULL

    通过生成查询时代码点火器框架 this gt db gt select id memo sent to sent by read by date gt from memos gt where FIND IN SET 1 sent to gt
  • Zxing有时会从条形码中获取错误的数据

    我知道这可能是一个相当简单的问题 我们还可以设置 Zxing 扫描的条形码格式 如下所示 1 intent putExtra SCAN MODE QR CODE MODE or any other format 如果我们这样做 2 inte
  • 什么时候优化为时过早? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 我看到这个词用得很多 但我
  • Xcode 5:代码签名权利错误

    我已经构建了一个支持 IOS 7 的新应用程序 我获得了新的 XCode 5 GM 并尝试使用我的新配置文件和分发证书来签署我的应用程序 但我在分发时遇到了问题 我不断收到以下错误 无效的代码签名权利 您的应用程序中的权利 包签名与包含在包
  • 拆分一列字符向量并返回一个列表

    我有以下内容数据框 df lt data frame Sl No c 1 6 Variable c a a b a b c b c b c Sl No Variable 1 a 2 a b 3 a b c 4 b 5 c 6 b c 我想将
  • os/exec StdoutPipe 带颜色

    我正在制作一个包装纸我的世界使用 Go 的服务器控制台 它使用 os exec 运行服务器和 process StdoutPipe 以获取子进程的实时输出 但是 由于某种原因我无法让它显示颜色 当我直接从终端运行服务器时 颜色可以工作 但当
  • 如何忽略包含在我的yarn.lock 文件中的包?

    因此 在我的 package json 中 我有一堆 npm 库 以及一个从 git ssh url 拉入的私有存储库 该存储库需要始终是最新版本 该yarn lock添加了git sha和yarn升级等不会获取最新的 基本上 鉴于此 de
  • 如何通过 Socket 连接接收大数据流 - 没有 TCPClient

    我有一个问题 我想通过 SocketConnection 发送一个大字符串 但我无法立即接收该字符串 因为网络限制为 1500 字节 那么如何在不使用 TCPClient 的情况下通过 Socket 接收所有字节 或者这是不可能的 publ
  • 如何在类路径中使用嵌入表达式

    我试图将文件的绝对值传递给类路径的读取函数 如果我传递绝对路径和类路径 它就可以正常工作 但是当我传递嵌入表达式时它不起作用 我的代码如下 Scenario create swagger first RAD 给定 url 应用服务器 给定参
  • 在 PrintDialog 中以编程方式选择打印机

    我在 Windows 窗体中有一个 Web 浏览器控件 它加载一个 HTML 文件 我希望能够为用户提供将其另存为 PDF 文件的选项 如果用户安装了 CutePDF Writer 那么我想我可以通过编程方式从打印对话框中选择它并将其另存为
  • jQuery 中的 this 和 $(this) 有什么区别?

    jQuery 中的 this 和 this 有什么区别 我什么时候应该使用哪个 p each function this id this attr id 如果您考虑上面的函数 jQuery 将循环访问页面上的每个段落元素 并通过将 this
  • 如何可靠地猜测 MacRoman、CP1252、Latin1、UTF-8 和 ASCII 之间的编码 [重复]

    这个问题在这里已经有答案了 在工作中 似乎每周都会遇到一些与编码相关的忧虑 灾难或灾难 该问题通常源于程序员认为他们可以在不指定编码的情况下可靠地处理 文本 文件 但你不能 因此决定从今以后禁止文件名以以下结尾 txt or text 人们