是否可以可靠地将用户文件自动解码为 Unicode? [C#]

2023-11-27

我有一个网络应用程序,允许用户上传其内容进行处理。处理引擎需要 UTF8(并且我正在从多个用户的文件编写 XML),因此我需要确保可以正确解码上传的文件。

因为如果我的用户知道他们的文件,我会感到惊讶were编码,我几乎不希望他们能够正确specify要使用的编码(解码器)。因此,我的应用程序只剩下解码前检测的任务。

这似乎是一个普遍的问题,我很惊讶没有找到解决方案的框架功能或一般配方。难道我没有使用有意义的搜索词进行搜索吗?

我已经实现了 BOM 感知检测(http://en.wikipedia.org/wiki/Byte_order_mark)但我不确定没有 BOM 来指示编码的文件上传的频率,这对于大多数非 UTF 文件没有用。

我的问题归结为:

  1. BOM 感知检测足以应对绝大多数文件吗?
  2. 如果BOM检测失败,是否可以尝试不同的解码器并确定它们是否“有效”? (我的尝试表明答案是“不”。)
  3. 在什么情况下,C# 编码器/解码器框架的“有效”文件会失败?
  4. 是否有一个存储库包含大量具有各种编码的文件可用于测试?
  5. 虽然我具体询问的是 C#/.NET,但下次我必须这样做时,我想知道 Java、Python 和其他语言的答案。

到目前为止我发现:

  • 带有 Ctrl-S 字符的“有效”UTF-16 文件导致编码为 UTF-8 引发异常(非法字符?)(这是一个 XML 编码异常。)
  • 使用 UTF-8 解码有效的 UTF-16 文件succeeds但给出带有空字符的文本。啊?
  • 目前,我只期望 UTF-8、UTF-16 和可能的 ISO-8859-1 文件,但我希望解决方案在可能的情况下是可扩展的。
  • 我现有的一组输入文件还不够广泛,不足以揭示实时文件会出现的所有问题。
  • 尽管我尝试解码的文件是“文本”,但我认为它们通常是使用在文件中留下垃圾字符的方法创建的。因此,“有效”文件可能不是“纯粹的”。噢,喜悦。

Thanks.


不会有绝对可靠的方法,但您也许可以通过一些启发式方法获得“相当不错”的结果。

  • 如果数据以 BOM 开头,请使用它。
  • 如果数据包含 0 字节,则可能是 utf-16 或 ucs-32。您可以通过查看 0 字节的位置来区分这些以及它们的大端和小端变体
  • 如果数据可以解码为utf-8(没有错误),那么它很可能是utf-8(或US-ASCII,但这是utf-8的子集)
  • 接下来,如果您想要国际化,请将浏览器的语言设置映射到该语言最可能的编码。
  • 最后,假设 ISO-8859-1

当然,“相当好”还是“足够好”取决于您的应用程序。如果您需要确定,您可能希望将结果显示为预览,并让用户确认数据看起来正确。如果没有,请尝试下一个可能的编码,直到用户满意为止。

Note:如果数据包含垃圾字符,该算法将不起作用。例如,原本有效的 utf-8 中的单个垃圾字节将导致 utf-8 解码失败,从而使算法走上错误的道路。您可能需要采取额外措施来处理此问题。例如,如果您可以事先识别可能的垃圾,请在尝试确定编码之前将其剥离。 (如果你剥离得太激进也没关系,一旦确定了编码,你就可以解码原始未剥离的数据,只需配置解码器以替换无效字符而不是抛出异常。)或者计算解码错误并适当加权。但这可能在很大程度上取决于垃圾的性质,即您可以做出什么假设。

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

是否可以可靠地将用户文件自动解码为 Unicode? [C#] 的相关文章

  • Matlab中反转一位逻辑位

    是否存在更好的方法来反转 X 的元素 gt gt X dec2bin 10 X 1010 我这样做了 x i num2str 1 str2num x i 如果我理解正确的话 你想将一位设置为 1 使用bitset bitset x bitN
  • 为 Visual Studio 2013 编译 Tesseract

    我正在尝试使用tesseract在 Visual Studio 2013 中 我在链接器 gt 输入 不是 libtesseract302 static lib 中使用 libtesseract302 lib 一切都正常 并且已编译并运行
  • CSV 从 UTF8 到 ISO-8859-1

    我正在尝试修改我的 CSV 导出 但它不会将我的 CSV 从 UTF 8 转换 保存为 ISO 8859 1 请问我做错了什么吗 实际上自从修改了这个之后 我得到了一个空的 CSV 文件 php 7 0 x function my Gene
  • 检测/删除 Python 2 + GTK 中不成对的代理字符

    在Python 2 7中我可以成功转换Unicode字符串 abc udc34xyz 转换为 UTF 8 结果是 abc xed xb0 xb4xyz 但是当我将 UTF 8 字符串传递给例如时 pango parse markup or
  • XamlReader.Load 在后台线程中。是否可以?

    WPF 应用程序具有从单独的文件加载用户控件的操作 使用XamlReader Load method StreamReader mysr new StreamReader pathToFile DependencyObject rootOb
  • 单元测试一起运行时失败,单独运行时通过

    所以我的单元测试遇到了一些问题 我不能只是将它们复制并粘贴到这里 但我会尽力而为 问题似乎是 如果我一项一项地运行测试 一切都会按预期进行 但如果我告诉它一起运行测试 则 1 5 将通过 TestMethod public void Obj
  • 使用 C 语言使用 strftime() 获取缩写时区

    我看过this https stackoverflow com questions 34408909 how to get abbreviated timezone and this https stackoverflow com ques
  • 如何在 C# 中定义文本框数组?

    您好 当我在 Windows 申请表上创建文本框时 我无法将其命名为 box 0 box 1 等 我这样做的目的是因为我想循环使用它们 其实我发现TextBox array firstTextBox secondTextBox 也有效
  • 在一个字节中存储 4 个不同的值

    我有一个任务要做 但我不知道从哪里开始 我不期待也绝对不想要代码中的答案 我想要一些关于该怎么做的指导 因为我感到有点失落 将变量打包和解包到一个字节中 您需要在一个字节中存储 4 个不同的值 这些值为 NAME RANGE BITS en
  • 如何使用 watin 中的 FileUploadDialogHandler 访问文件上传对话框

    我正在使用 IE8 和 watin 并尝试通过我的网页测试上传文件 我不能简单地使用 set 方法设置上传文件 例如 ie FileUpload Find ById someId Set C Desktop image jpg 因为上传文本
  • Visual Studio 中的测试单独成功,但一组失败

    当我在 Visual Studio 中单独运行测试时 它们都顺利通过 然而 当我同时运行所有这些时 有些通过 有些失败 我尝试在每个测试方法之间暂停 1 秒 但没有成功 有任何想法吗 在此先感谢您的帮助 你们可能有一些共享数据 检查正在使用
  • 如何编写一个同时需要请求和响应Dtos的ServiceStack插件

    我需要提供本地化数据服务 所有本地化的响应 Dto 都共享相同的属性 IE 我定义了一个接口 ILocalizedDto 来标记那些 Dto 在请求端 有一个ILocalizedRequest对于需要本地化的请求 Using IPlugin
  • 私有模板函数

    我有一堂课 C h class C private template
  • .NET中的LinkedList是循环链表吗?

    我需要一个循环链表 所以我想知道是否LinkedList是循环链表吗 每当您想要移动列表中的 下一个 块时 以循环方式使用它的快速解决方案 current current Next current List First 电流在哪里Linke
  • (de)从 CSV 序列化为对象(或者最好是类型对象的列表)

    我是一名 C 程序员 试图学习 C 似乎有一些内置的对象序列化 但我在这里有点不知所措 我被要求将测试数据从 CSV 文件加载到对象集合中 CSV 比 xml 更受青睐 因为它更简单且更易于人类阅读 我们正在创建测试数据来运行单元测试 该集
  • 如何在 C# 中调整图像大小同时保持高质量?

    我从这里找到了一篇关于图像处理的文章 http www switchonthecode com tutorials csharp tutorial image editing saving cropping and resizing htt
  • Server.MapPath - 给定的物理路径,预期的虚拟路径

    我正在使用这行代码 var files Directory GetFiles Server MapPath E ftproot sales 在文件夹中查找文件 但是我收到错误消息说 给定物理路径但虚拟路径 预期的 我对在 C 中使用 Sys
  • 编译时“strlen()”有效吗?

    有时需要将字符串的长度与常量进行比较 例如 if line length gt 2 Do something 但我试图避免在代码中使用 魔法 常量 通常我使用这样的代码 if line length gt strlen Do somethi
  • memset 未填充数组

    u32 iterations 5 u32 ecx u32 malloc sizeof u32 iterations memset ecx 0xBAADF00D sizeof u32 iterations printf 8X n ecx 0
  • 如何使用 Word Automation 获取页面范围

    如何使用办公自动化找到 Microsoft Word 中第 n 页的范围 似乎没有 getPageRange n 函数 并且不清楚它们是如何划分的 这就是您从 VBA 执行此操作的方法 转换为 Matlab COM 调用应该相当简单 Pub

随机推荐

  • 将值从 HTML 传递到 SCSS

    我是 SCSS 的新手 不太确定如何使用它 我已经在 SO 和其他地方寻找解决方案 但找不到 我正在开发一个显示手机列表的应用程序 我通过调用 REST API 获取此列表 以 JSON 形式 所有手机都显示相同类型的信息 例如名称 型号
  • 如何使TabPages可拖动?

    我想让用户通过拖放来重新排列 TabPages 顺序 此外 如果用户能够将 TabPages 从一个 TabControl 拖动到另一个 TabControl 那就太酷了 两种方式都与 Firefox 和 Total Commander 类
  • 将 List[Either[A, B]] 转换为 Either[List[A], List[B]]

    如何转换List Either String Int to Either List String List Int 使用类似于猫的方法sequence 例如 xs sequence在下面的代码中 import cats implicits
  • 对月份(带字符串)排序算法

    我有这个月的数组 January March December October 我想把它排序如下 January March October December 我目前正在思考 如果 否则 可怕的级联 但我想知道是否还有其他方法可以做到这一点
  • 将 strsplit 应用于 data.frame 中的特定列

    我有一个包含分类信息的大型数据框 这是一个例子 gt d lt data frame x c 1 2 3 4 classification c cl1 scl1 cl2 cl3 bla cl4 subclass2 gt d x classi
  • onClick 事件未触发 |安卓

    我制作了一个非常简单的测试应用程序 其中包含一项活动和一种布局 这onClick第一次按下时不会触发 正如它应该的那样 活动 package com example mytest import android os Bundle impor
  • 无法 docker pull - 连接被拒绝

    我正在 ubuntu virtualbox 中从 docker 运行以下命令 并收到连接被拒绝错误 我位于公司代理后面 并配置了环境变量以使用代理以及用户名和密码 我还尝试使用代理链 root mbak1 VirtualBox sudo p
  • 有没有办法在 JSP 中填充地图?

    例如
  • 什么是“此处需要”错误

    它位于我的 Eclipse Problems 视图中 代码编译正常 但出现错误 required from here 指向一些 boost 头文件和行state data const current state interlocked co
  • 如何测试 Haskell 中的错误?

    我希望能够确保函数在接收到无效值时会抛出错误 例如 假设我有一个仅返回正数的函数 pos pos Int gt Int pos x x gt 0 x otherwise error Invalid Input 这是一个简单的例子 但我希望你
  • 冗余通用参数

    我有这两个接口和类 public interface Identifiable
  • 如何保护nodejs中的公共动态文件夹

    我在 public images picture jpg 中显示带有玉的图片 但我想保护某些图片或限制对公共文件夹的访问 该怎么做 project node modules public images image jpg javascrip
  • 如何在Excel中仅复制单元格的纯文本?

    我正在设计一个 Excel 工作表 用户将单击一个命令按钮来复制预定的单元格范围 然后 用户可以使用 Firefox 或 IE 将内容粘贴到 Web 应用程序中 Web 应用程序的设计超出了我的控制范围 目前用于数据输入的文本框是富文本输入
  • 为多个变量制作堆积条形图 - R 中的 ggplot2

    我在 ggplot2 中制作堆积条形图时遇到一些问题 我知道如何用 barplot 制作一个 但我想使用 ggplot2 因为很容易使条形具有相同的高度 如果我没有记错的话 使用 position fill 我的问题是我有多个变量 我想将它
  • 有效地找到独特的排列

    我有以下问题 我需要计算一个集合的排列 然而 该集合可能包含两个相同的元素 因此会导致重复排列 例如 给定集合 0 0 1 2 排列包括以下可能性 1 2 0 0 1 2 0 0 但是 我想避免类似的相同排列 在 MATLAB 中我可以简单
  • 验证一个字段或另一个字段是否存在 (XOR)

    如何验证一个或另一个字段的存在 但不能同时验证两个字段和至少一个字段的存在 如果您将条件添加到数值验证中 您的代码将起作用 如下所示 class Transaction lt ActiveRecord Base validates pres
  • 如何退出或关闭(而不是杀死)Word文档(进程)?

    在我们公司 我们使用 Windows 应用程序生成 Word 2010 文档 有时文档没有正确关闭 因此另一个应用程序 是的 他们仍然称之为开发 杀死运行超过1分钟的word进程 这些被杀死的进程存储在MS Word的 文档恢复 中 这些文
  • 如何使控制中心滑块可编辑?

    我正在开发一个可以播放声音文件的应用程序 如果我打开苹果音乐应用程序 滑块可以让我在我所在的歌曲之间移动 其他应用程序 例如 Spotify 或 overcast 不允许这种行为 到目前为止 我已经能够更改控制中心的所有参数 但除外 有什么
  • opencv中cv::KeyPoint类的类成员class_id的含义和用途是什么?

    OpenCV 2 4 3参考手册中KeyPoint class id被描述为 可用于按其所属对象对关键点进行聚类的对象 ID 由于我对 关键点 缺乏足够的了解 我无法理解其目的是什么class id 我的另一个问题是 通过使用特征检测器 描
  • 是否可以可靠地将用户文件自动解码为 Unicode? [C#]

    我有一个网络应用程序 允许用户上传其内容进行处理 处理引擎需要 UTF8 并且我正在从多个用户的文件编写 XML 因此我需要确保可以正确解码上传的文件 因为如果我的用户知道他们的文件 我会感到惊讶were编码 我几乎不希望他们能够正确spe