Проблема преобразования кодировки - PullRequest
1 голос
/ 19 мая 2009

У меня небольшая проблема с изменением кодировки строки. На самом деле я читаю из строк БД, которые кодируются с использованием кодовой страницы 850, и мне нужно подготовить их, чтобы они подходили для совместимой службы WCF.

Из БД я читаю символы \ 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 голосов
/ 25 февраля 2012

Вы должны попробовать это:

byte[] sourceBytes = sourceEncoding.GetBytes(value);
var convertedString = Encoding.UTF8.GetString(sourceBytes);
0 голосов
/ 10 января 2010
  1. byte[] sourceBytes =Encoding.Default.GetBytes(value)
  2. Encoding.UTF8.GetString(sourceBytes)

эта последовательность полезна для загрузки файла Unicode из сервиса (например, XML-файл, содержащий персидский символ)

0 голосов
/ 19 мая 2009

Кажется, вы думаете, что есть проблема, основанная на неправильном понимании. Но jmservera верен - все строки в .NET внутренне кодируются как юникод.

Вы не сказали точно, чего хотите достичь. Испытываете ли вы проблему на другом конце провода?

Только для справки, вы можете установить кодировку текста для привязки WCF с помощью элемента textMessageEncoding в файле конфигурации.

0 голосов
/ 19 мая 2009

Я подозреваю, что эта строка может быть вашим виновником

reEncodedString = sourceEncoding.GetString(targetBytes);

, который, кажется, берет целевую закодированную строку байтов и просит ваш sourceEncoding сделать из них строку. У меня не было возможности проверить это, но я подозреваю, что следующее может быть лучше

reEncodedString = targetEncoding.GetString(targetBytes);
0 голосов
/ 19 мая 2009

Все строки, хранящиеся в строке, на самом деле являются Unicode.Unicode. Читайте: Строки в .Net и C # и Абсолютный минимум Каждый разработчик программного обеспечения Абсолютно, положительно должен знать о Unicode и наборах символов (никаких оправданий!)

Редактировать: Я полагаю, что вы хотите, чтобы функция 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. Таким образом, для того, чтобы это преобразование произошло, вам придется изменить эти символы вручную.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...