【问题标题】:Convert encoding before inserting into a database在插入数据库之前转换编码
【发布时间】:2021-03-23 09:57:02
【问题描述】:

我正在开发一个程序,该程序从平面文件中读取数据并将其插入到 sql server 上的数据库中。问题是文件使用代码页 850 编码,而数据库使用代码页 1252。这意味着我必须转换要插入的字符串的编码。

我使用这种方法进行转换:

        private Encoding _sourceEncoding = Encoding.GetEncoding(850);
        private Encoding _destinationEncoding = Encoding.GetEncoding(1252);

        private string AdjustCodePage(string msg)
        {
            byte[] source = _sourceEncoding.GetBytes(msg);
            //byte[] destination = Encoding.Convert(_sourceEncoding, _destinationEncoding, source);
            return _destinationEncoding.GetString(source);
        }

但是这种方法并没有给我预期的结果。当我从数据库中选择数据时,所有特殊字符(如“ä”、“ö”、“ü”)都被替换为“?”

为什么我的转换不起作用?

【问题讨论】:

  • A string 始终是 UTF-16。您在此处应用的转换没有任何意义 - 如果您确保使用正确的编码从平面文件中读取字符串,那么字符串中应该包含正确的数据,并且您不需要这样做别的什么。
  • string 始终是 Unicode,您必须在系统边缘进行解码/编码,即在从文件中读取字符串时应用解码并让 ADO.NET(或任何您用于数据库访问)处理数据库编码。
  • 感谢@JonSkeet 帮助了我。它现在正在工作!
  • @Tomsen SQL Server 如果您将文本保存在nvarchar 列中也不会出现编码问题。您确实需要什么都不做 以在单个字段中包含中文、德文和西里尔文文本。 StackOverflow 证明了这一点 - 一个 .NET 应用程序在 nvarchar 字段中保存文本。这就是为什么我可以写 Αυτό εδώä,ö,ü 并希望评论出现没有问题。

标签: c# .net sql-server encoding


【解决方案1】:

正如 Jon Skeet 和 Klaus Gütter 在他们的 cmets 中所说,字符串始终是 UTF-16。这意味着,AdjustCodePage 没有做任何事情,因为字符串本身保持不变。 不像我想的那样工作。

为了获得预期的结果,我必须改变读取文件的方式。所以我从

string[] lines = File.ReadAllLines(filepath);

string[] lines = File.ReadAllLines(filepath, Encoding.GetEncoding(850));

这样,转换发生在系统边缘,就在实际字符串创建之前。

感谢 Jon Skeet 和 Klaus Gütter!

【讨论】:

  • “这意味着,AdjustCodePage 没有做任何事情,因为字符串本身保持不变” - 不,AdjustCodePage 肯定确实 做某事......它会丢失信息!它使用一种编码对字符串进行编码,然后将其解码,就好像它已被编码为不同的编码一样(就像试图将 PNG 文件解释为 JPEG 一样)。
  • 为什么要先用这个代码页保存文件? .NET Core 和 .NET Old(至少在最近的版本中)中的 StreamWriter 和 StreamReader 类默认使用 UTF8。
  • @PanagiotisKanavos 我不知道...我没有制作这个文件。
猜你喜欢
  • 2016-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-19
  • 2021-12-18
  • 1970-01-01
相关资源
最近更新 更多