【问题标题】:Encoding Conversion problem编码转换问题
【发布时间】:2009-05-19 12:09:38
【问题描述】:

我在更改字符串的编码时遇到了一点问题。实际上,我从使用代码页 850 编码的数据库字符串中读取数据,并且我必须准备它们以适用于可互操作的 WCF 服务。

我从数据库中读取字符 \x10 和 \x11(三角形),我想将它们转换为 Unicode 格式,以防止 WCF 调用期间出现序列化/反序列化问题。 (字符 并且根据 XML 规范无效,即使 WCF 序列化它们)。

现在,我使用以下代码来隐藏字符串编码,但没有任何反应。结果字符串实际上与原始字符串相同。

我可能错过了什么......

请帮帮我!!!

伊曼纽尔

 static class UnicodeEncodingExtension
    {
        public static string Convert(this Encoding sourceEncoding, Encoding targetEncoding, string value)
        {
            string reEncodedString = null;

            byte[] sourceBytes = sourceEncoding.GetBytes(value);
            byte[] targetBytes = Encoding.Convert(sourceEncoding, targetEncoding, sourceBytes);
            reEncodedString = sourceEncoding.GetString(targetBytes);

            return reEncodedString;
        }

    }

    class Program
    {
        private static Encoding Cp850Encoding = Encoding.GetEncoding(850);
        private static Encoding UnicodeEncoding = Encoding.UTF8;

        static void Main(string[] args)
        {
            string value;
            string resultValue;
            value = "\x10";
            resultValue = Cp850Encoding.Convert(UnicodeEncoding, value);

            value = "\x11";
            resultValue = Cp850Encoding.Convert(UnicodeEncoding, value);

            value = "\u25b6";
            resultValue = UnicodeEncoding.Convert(Cp850Encoding, value);

            value = "\u25c0";
            resultValue = UnicodeEncoding.Convert(Cp850Encoding, value);

        }

    }

【问题讨论】:

    标签: c# .net wcf unicode encoding


    【解决方案1】:

    您似乎认为存在基于错误理解的问题。但是 jmservera 是正确的 - .NET 中的所有字符串都在内部编码为 un​​icode。

    你没有准确地说出你想要完成什么。您在电线的另一端遇到问题吗?

    仅供参考,您可以使用配置文件中的textMessageEncoding element 在 WCF 绑定上设置文本编码。

    【讨论】:

    • 问题出在Java客户端解码期间。当字符串包含 \x10 或 \x11 WCF 错误地允许将它们编码为 和 根据 XML 规范,它们不是有效的 XML 字符。我在这里看到 [en.wikipedia.org/wiki/Code_page_850] codePage 850 中的 char \x10 对应于 char \u25ba ,所以我认为编码转换应该可以解决我的问题。
    • 根据 XML 规范,处理器需要处理 UTF-8 和 UTF-16。那么,您能否不编码为 UTF-8 并将您的字符通过网络传送到客户端?
    • 没有。当我序列化 \x10 结果是 这是一个有效的 Unicode 字符,但不是一个有效的 XML 字符。在其他世界中,XML 规范处理 UTF-* 字符,但某些字符范围除外。见这里 [w3.org/TR/2008/REC-xml-20081126/#charsets]
    【解决方案2】:

    我怀疑这条线可能是你的罪魁祸首

    reEncodedString = sourceEncoding.GetString(targetBytes);
    

    这似乎采用了您的目标编码字节字符串,并要求您的 sourceEncoding 从中制作一个字符串。我没有机会验证它,但我怀疑以下可能会更好

    reEncodedString = targetEncoding.GetString(targetBytes);
    

    【讨论】:

      【解决方案3】:

      string中存储的所有字符串实际上都是Unicode.Unicode。阅读:Strings in .Net and C# 和 The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)

      编辑:我想你希望 Convert 函数自动将 \x11 更改为 \u25c0,但这里的问题是 \x11 在几乎任何编码中都有效,差异通常从字符 \x80 开始,所以 Convert 函数即使您这样做,也会维护它:

      string reEncodedString = null;
      byte[] unicodeBytes = UnicodeEncoding.Unicode.GetBytes(value);
      byte[] sourceBytes = Encoding.Convert(Encoding.Unicode,
                                      sourceEncoding, unicodeBytes);
      

      您可以在unicode.org 中看到从 CP850 到 Unicode 的映射。因此,要进行这种转换,您必须手动更改这些字符。

      【讨论】:

        【解决方案4】:
        1. byte[] sourceBytes =Encoding.Default.GetBytes(value)
        2. Encoding.UTF8.GetString(sourceBytes)

        此序列对于从服务下载 unicode 文件很有用(例如包含波斯字符的 xml 文件)

        【讨论】:

          【解决方案5】:

          你应该试试这个:

          byte[] sourceBytes = sourceEncoding.GetBytes(value);
          var convertedString = Encoding.UTF8.GetString(sourceBytes);
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-04-01
            • 1970-01-01
            • 2013-08-22
            • 2013-01-28
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多