【问题标题】:How to detect charset of text?如何检测文本的字符集?
【发布时间】:2012-02-04 17:29:20
【问题描述】:

我有一段带有变音符号的文本显示不好,例如:¤ 或 ˇ 或 ˘。我不知道文本是什么字符集。有什么简单的方法可以弄清楚吗?如果有一些在线字符集检测器或字符集转换预览器会很好吗?我想到了一个应用程序,它可以向我展示某些特定的变音符号在所有可用编码中的格式错误,以便我能够跟踪适合我在文本中的字符的那个。

有什么想法吗?

【问题讨论】:

  • 必须是C#还是PHP?
  • 它可以是 C#、PHP 或任何我可以在 Windows 上运行的应用程序或网站工具。
  • 您从哪里获取文本?磁盘上的文件?
  • 来自文件,但缺少编码信息
  • 但我需要适用于剪贴板文本的解决方案(不是直接的,我可以将其粘贴到 C# 或 PHP 代码中)

标签: c# php diacritics


【解决方案1】:

在 Windows PowerShell 中:

$bytes = [IO.File]::ReadAllBytes('some file.txt')
[Text.Encoding]::GetEncodings() |
  %{
    $_|Add-Member -pass Noteproperty Text ($_.GetEncoding().GetString($bytes))
  } | fl Name,Codepage,Text

调整文件的路径并浏览结果,直到你看到看起来正确的东西;-)

这只是遍历 .NET 已知的所有编码,并使用相应的编码将文本转换为字符串。

【讨论】:

    【解决方案2】:

    在 C# 中:

    foreach (EncodingInfo encodingInfo in Encoding.GetEncodings())
        using (FileStream fileStream = File.OpenRead(filePath))
        using (StreamReader reader = new StreamReader(fileStream, encodingInfo.GetEncoding(), false))
            textBox1.Text += encodingInfo.DisplayName + ":\t " + reader.ReadToEnd() + "\r\n";
    

    其中textBox1 是一个大型多行TextBox(或任何其他合适的控件)。

    我学到的一些注意事项:

    1. 默认情况下,控制台应用程序不支持 Unicode。
    2. File.ReadAllText 尝试根据字节顺序标记的存在自动检测文件的编码,即使明确指定了另一种编码也是如此。抑制这种情况的唯一方法是通过 StreamReader 构造函数重载,它允许抑制查找字节顺序标记。

    【讨论】:

    • 以及如何从剪贴板执行此操作?
    • 我建议使用基于文件的方法(使用 original 文件)。当使用不正确的编码时,解码是一种有损操作。
    猜你喜欢
    • 2011-05-30
    • 2012-04-13
    • 2012-01-28
    • 1970-01-01
    • 2013-12-13
    • 1970-01-01
    • 1970-01-01
    • 2018-06-02
    相关资源
    最近更新 更多