【问题标题】:How to detect character sets encoding for all of language? [duplicate]如何检测所有语言的字符集编码? [复制]
【发布时间】:2014-01-26 07:38:55
【问题描述】:

我有一个 .smi 文件。 当我用记事本++打开时,我有:

<font color="#FF8040"><I>- °øµ¿¹ø¿ªÀÌ´Ùº¸´Ï Áö¸í°ú À̸§ÀÌ ¾à°£¾¿ Ʋ¸±¼ö ÀÖ½À´Ï´Ù.-</I></font>

然后我设置字符集>韩语> UEC-KR:

<font color="#FF8040"><I>- 공동번역이다보니 지명과 이름이 약간씩 틀릴수 있습니다.  -</I></font>

那么,我可以在 C# 中做什么?我希望当我打开文件时,应用程序可以检测字符集并显示在富文本框中。 我用过:

System.IO.StreamReader sr = new System.IO.StreamReader(openFile.FileName);
inputText.Text = sr.ReadToEnd();
inputText.SelectAll();
inputText.SelectionFont = new Font("Arial Unicode MS",9,FontStyle.Regular);

inputText 中的结果:

<font color="#FF8040"><I>- ���������̴ٺ��� ����� �̸��� �ణ�� Ʋ���� �ֽ��ϴ�.  -</I></font>

【问题讨论】:

    标签: c#


    【解决方案1】:

    您需要告诉您的StreamReader 在读取文件时使用适当的编码。您可以通过将第一行更改为:

    var krEncoding = System.Text.Encoding.GetEncoding("euc-kr");
    System.IO.StreamReader sr = 
        new System.IO.StreamReader(openFile.FileName, krEncoding);
    

    这是可能的,因为StreamReader 构造函数有一个overload,它接受编码作为参数。

    【讨论】:

    • 我可以让它自动吗?只要打开一个文件,app就可以得到System.Text.Encoding.GetEncoding(Enconding code)..
    • @user3172506 不,请参阅 Mormegil 提供的链接作为对该问题的评论。没有可靠的编码检测这样的东西。您能做的最好的事情是运行一些适用于有限场景的启发式方法。 You basically have to know the encoding beforehand.
    【解决方案2】:

    我还没有看到任何 *.smi,所以我的回答在某种程度上可能是虚假的,但是:

    1. 如果文件是原始的 16 位 unicode

      • 那么任何字符都被编码为 2 个字节
      • 将文件视为二进制文件并查看前两个 BYTE
      • 应该是 FF,FE [十六进制]
      • 它是原始的 16 位 UNICODE 编码签名
      • 之后任何字符都设置为两个 BYTE:'ASCII',codepage
      • 读取代码页字节并查看它是什么语言...
      • 或使用完整的 unicode 字体
    2. 如果文件是 UTF-8 / UTF-16

      • 从扩展字符编码中检测代码页(参见 unicode 文档)
      • 或使用完整的 unicode 字体
    3. *.smi 中的数据与文件本身的编码方式不同

      • 在这种情况下,请在 smi 文档中查找代码页标签
      • 如果没有,那你就不走运了
      • 如果是,那么您应该使用标签进行解码...

    附言。没有多少 unicode 字体,没有一个是完整的!!!
    从更好的(支持更多页面)我只知道:

    • 基维拉
    • unifont(注意这是位图字体!!!)
    • 但我已经有大约一年没有在该领域进行任何研究了,所以情况可能会改变......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-06
      • 1970-01-01
      • 2019-07-08
      • 1970-01-01
      • 1970-01-01
      • 2012-03-16
      • 2011-05-03
      相关资源
      最近更新 更多