时间戳转换器

使用 .NET 如何将包含 Latin-1 重音字符的 ISO 8859-1 编码文本文件转换为 UTF-8

日期:2023-02-24     浏览:134    
【中文标题】使用 .NET 如何将包含 Latin-1 重音字符的 ISO 8859-1 编码文本文件转换为 UTF-8【英文标题】:Using .NET how to convert ISO 8859-1 encoded text files that contain Latin-1 accented characters to UTF-8 【发布时间】:2011-02-05 10:19:22 【问题描述】:

我收到了以ISO 88591-1 格式保存的文本文件,其中包含来自Latin-1 范围的重音字符(以及正常的ASCII a-z 等)。如何使用 C# 将这些文件转换为 UTF-8,以便 ISO 8859-1 中的单字节重音字符成为有效的 UTF-8 字符?

我尝试使用带有 ASCIIEncoding 的 StreamReader,然后通过实例化编码 ascii 和编码 utf8 然后使用 Encoding.Convert(ascii, utf8, ascii.GetBytes( asciiString) ) 将 ASCII 字符串转换为 UTF-8 — 但重音字符被呈现为问题标记。

我错过了什么步骤?

【问题讨论】:

您是否尝试过使用带有 UTF8 编码的 StreamWriter 将 asciiString 写入文本文件?这样做可以吗? @Task:他的问题是他永远无法从 8859-1 中取出字符串,而不是他无法将其保存为 UTF-8。 哦,这完全是他的问题,毫无疑问。我只是发现使用 StreamReader/StreamWriter 对(因此我可以看到输入/输出文件)而不是使用 Encoding.Convert 调用来调试文本转换更容易。那可能只是我。 @Task:我同意(因此我的回答!);) 【参考方案1】:

您需要获取正确的Encoding 对象。 ASCII 顾名思义:ASCII,意思是它只支持 7 位 ASCII 字符。如果您要做的是转换文件,那么这可能比直接处理字节数组更容易。

using (System.IO.StreamReader reader = new System.IO.StreamReader(fileName,
                                       Encoding.GetEncoding("iso-8859-1")))

    using (System.IO.StreamWriter writer = new System.IO.StreamWriter(
                                           outFileName, Encoding.UTF8))
    
        writer.Write(reader.ReadToEnd());
    

但是,如果您想自己拥有字节数组,使用Encoding.Convert 很容易。

byte[] converted = Encoding.Convert(Encoding.GetEncoding("iso-8859-1"), 
    Encoding.UTF8, data);

在这里需要注意的是,如果你想走这条路,那么你应该不使用基于编码的字符串阅读器,如StreamReader 来处理你的文件 IO。 FileStream 会更合适,因为它会读取文件的实际字节。

为了充分探索这个问题,这样的事情会起作用:

using (System.IO.FileStream input = new System.IO.FileStream(fileName,
                                    System.IO.FileMode.Open, 
                                    System.IO.FileAccess.Read))

    byte[] buffer = new byte[input.Length];

    int readLength = 0;

    while (readLength < buffer.Length) 
        readLength += input.Read(buffer, readLength, buffer.Length - readLength);

    byte[] converted = Encoding.Convert(Encoding.GetEncoding("iso-8859-1"), 
                       Encoding.UTF8, buffer);

    using (System.IO.FileStream output = new System.IO.FileStream(outFileName,
                                         System.IO.FileMode.Create, 
                                         System.IO.FileAccess.Write))
    
        output.Write(converted, 0, converted.Length);
    

在本例中,buffer 变量以byte[] 形式填充文件中的实际数据,因此不进行任何转换。 Encoding.Convert 指定源和目标编码,然后将转换后的字节存储在名为...converted 的变量中。然后直接将其写入输出文件。

就像我说的,第一个选项使用StreamReader 和StreamWriter 会更简单,如果这就是你所做的一切,但后一个例子应该给你更多关于实际情况的提示。

【讨论】:

感谢大家的帮助,尤其是@Adam 的彻底回答【参考方案2】:

如果文件相对较小(例如,约 10 兆字节),您只需要两行代码:

  string txt = System.IO.File.ReadAllText(inpPath, Encoding.GetEncoding("iso-8859-1"));
  System.IO.File.WriteAllText(outPath, txt);

【讨论】:

为什么你的解决方案只有在读取的文件小于 10 兆字节时才有效?

相关文章

如何从 .NET 中的字符串中删除变音符号(重音符号)?

{】如何从.NET中的字符串中删除变音符号(重音符号)?【英文标题】:HowdoIremovediacritics(accents)fromastringin.NET?【发布时间】:2010-09-1922:19:12【问题描述】:我正在尝试转换一些法语加拿大语的字符串,基本上,我希望能够在保留...}

如何从 .NET 中的字符串中删除变音符号(重音符号)?

{】如何从.NET中的字符串中删除变音符号(重音符号)?【英文标题】:HowdoIremovediacritics(accents)fromastringin.NET?【发布时间】:2010-09-1922:19:12【问题描述】:我正在尝试转换一些法语加拿大语的字符串,基本上,我希望能够在保留...}

使用带有无效字符的 Net::FTP gettextfile (ASCII-8BIT vs UTF-8)

{】使用带有无效字符的Net::FTPgettextfile(ASCII-8BITvsUTF-8)【英文标题】:UsingNet::FTPgettextfilewithinvalidcharacters(ASCII-8BITvsUTF-8)【发布时间】:2014-07-0222:30:05【问题描述】:我有一个通过FTP从大型机获取平面文件的进程。这通常可以正常工...}

什么 .NET StringComparer 相当于 SQL 的 Latin1_General_CI_AS

{...法是根据查询的参数缓存某些数据库查询的结果。数据库使用默认排序规则-SQL_Latin1_}

如何将重音字符与 PHP preg 匹配?

{...á”、“é”等“特殊”字母。但是,我不希望他们能够使用“!”、“@”、“%”等符号。有没有办法编写一个正则表达式来完成这个?(最好不要指定每个特殊字母。)现在我有:$reg=\'/^[\\w\}

如何在Python中将英文单词与其等效的重音字符匹配[重复]

{】如何在Python中将英文单词与其等效的重音字符匹配[重复]【英文标题】:HowtomatchEnglishwordwithitsequivalentAccentedcharactersinPython[duplicate]【发布时间】:2015-10-0911:48:10【问题描述】:我正在尝试自动化一个应用程序,它就像谷歌引擎...}

如何将带有无效字符(重音)的 Pandas 数据框与数组匹配? [复制]

{...:2017-05-1701:59:41【问题描述】:我一直在尝试在Python3中使用PandasDataframe来查找与CSV文件中的名称匹配的特定ID。我正在阅读的API为我提供了A}

MySQL 触发器使用值数组替换重音/不需要的变量

{】MySQL触发器使用值数组替换重音/不需要的变量【英文标题】:MySQLTriggerReplaceAccented/UnwantedVariablesusinganArrayofValues【发布时间】:2021-08-2402:18:32【问题描述】:我正在尝试创建一个MySQL触发器来将字符串更改为正确的文件名。我...}

用普通的ascii字符替换重音字符[重复]

{...含非ascii字符:HernándezQuermançósMigueláñez现在一种方法是使用正则表达式来删除任何非字母数字字符,例如a.repl}

使用 Latin-1 编码 Spyne SOAP XML 响应

{】使用Latin-1编码SpyneSOAPXML响应【英文标题】:EncodingSpyneSOAPXMLresponsewithLatin-1【发布时间】:2019-08-2116:20:04【问题描述】:我最近设置了一个用于发送XML响应的Spyne应用程序。就目前而言,应用程序正在正确地发送响应——但是,...}

Copyright ©2021 时间戳转换器 小常识 114pp | 陕ICP备18005036号