编码转换问题

时间:2009-05-19 12:09:39

标签: c# .net wcf unicode encoding

我在更改字符串的ecoding方面遇到了一些问题。实际上,我从使用代码页850编码的DB字符串中读取,我必须准备它们以便适合可互操作的WCF服务。

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

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

我可能错过了一些东西......

请帮帮我!!!

Emanuele的

 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);

        }

    }

5 个答案:

答案 0 :(得分:0)

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

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

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

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

答案 1 :(得分:0)

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

你没有说出你想要完成的目标。您是否在电线的另一端遇到问题?

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

答案 2 :(得分:0)

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

reEncodedString = sourceEncoding.GetString(targetBytes);

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

reEncodedString = targetEncoding.GetString(targetBytes);

答案 3 :(得分:0)

  1. byte[] sourceBytes =Encoding.Default.GetBytes(value)
  2. Encoding.UTF8.GetString(sourceBytes)
  3. 此序列对于从服务下载unicode文件非常有用(例如包含波斯字符的xml文件)

答案 4 :(得分:0)

你应该试试这个:

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