【问题标题】:How to decode a utf string in c#如何在c#中解码一个utf字符串
【发布时间】:2012-11-30 11:44:21
【问题描述】:

我一直在尝试解码以下字符串:

Crédit 

在c#中使用以下代码:

    Encoding iso = Encoding.GetEncoding("ISO-8859-1");
    Encoding utf8 = Encoding.UTF8;
    string msg = iso.GetString(utf8.GetBytes(@"Crédit"));

这是让步:

Crédit

我在网上查看了http://jeppesn.dk/utf-8.html,这是正确的 utf 8,应该会产生:

Crédit

谁能指出我哪里出错了?

谢谢

【问题讨论】:

    标签: c# asp.net-mvc encoding character


    【解决方案1】:

    应该反过来,Windows-1252,而不是 ISO-8859-1。根据上下文,人们在说 Latin-1 或 ISO-8859-1 时通常指的是 Windows-1252,但实际上使用 ISO-8859-1 会在有 之类的字符时失败,因为它首先是一个错误标签.当 ISO-8859-1 被指定为编码时,甚至浏览器也使用 Windows-1252。

    Encoding w1252 = Encoding.GetEncoding(1252);
    Encoding utf8 = Encoding.UTF8;
    string msg = utf8.GetString(w1252.GetBytes(@"Crédit"));
    

    【讨论】:

    • 鉴于所涉及的字符都没有在此处的“洞”中 (0x80-0x9F),我相信 Windows-1252/ISO-8859-1 部分是红鲱鱼。 (更重要的是,这基本上是一种从根本上破坏的方法。)
    • @JonSkeet 是的,我知道,无论如何我总是宣扬它。如果他尝试使用À next (they always do) 会怎样?那么我们还有一个问题..
    【解决方案2】:

    基本上,您正在尝试做一些没有意义的事情。您几乎不应该1将一种编码的输出解释为另一种编码的输入。这就像说,“假设我将此图像保存为 gif ......然后使用 jpeg 加载器加载该文件......它是什么样的?”

    怀疑如果你使用:

    // Just an example: don't actually do this.
    string msg = utf8.GetString(iso.GetBytes(@"Crédit"));
    

    ...它会做你想做的事,但你根本不应该这样做

    现在,您的真实输入是什么(以什么形式)以及您想要实现什么?


    1 如果您这样做,通常是因为其他人已经做了错误的事情,或者某处存在配置问题。如果您发现自己正在这样做,您应该非常仔细地考虑您是否应该真的这样做,或者您是否只是在解决应该以不同方式解决的不同问题。

    【讨论】:

    • 虽然 op 似乎只是出于好奇才这样做,但有很多真正的用例 你不应该将一种编码的输出解释为另一种编码的输入。比如repairing and restorng seriously screwed up transfers of text我相信在辛普森的一集中甚至提到了西里尔编码的错误:P
    • @Esailija:修复损坏的数据基本上就是承认在你之前的某个人已经做了我说过你不应该做的事情......如果你正在这样做出于修复目的,您很可能已经丢失了数据。
    • 好吧,我认为你的意思是永远不应该编写这样的代码。损坏的数据根本不是承认编写了这样的代码。如果没有这样的代码,还有很多其他方式会发生损坏的数据。
    • @Esailija:嗯,你必须告诉我 exact 的情况...通常我会尝试直接获取存储的 binary i> 尽可能的数据。如果这让你更开心,我会编辑为“几乎从不”。
    • @Esailija:是的,这听起来像是将保存在一种编码中的字符数据解释为保存在另一种编码中。也避免这样做:)
    猜你喜欢
    • 1970-01-01
    • 2012-06-05
    • 1970-01-01
    • 1970-01-01
    • 2021-08-24
    • 1970-01-01
    • 2012-10-18
    • 2018-11-05
    • 1970-01-01
    相关资源
    最近更新 更多