2009-05-19 3 views
1

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

Из БД я читаю символы \ x10 и \ x11 (треугольные фигуры), и я хочу преобразовать их в формат Unicode, чтобы предотвратить проблему сериализации/десериализации во время вызова WCF. (Chars и недопустимы в соответствии с спецификациями 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); 

     } 

    } 

ответ

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

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

0

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

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

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

+0

Проблема возникает во время декодирования на стороне клиента Java.Когда строка содержит \ x10 или \ x11 WCF, ошибочно разрешает кодирование их в и , которые являются недопустимыми символами XML в соответствии со спецификацией XML. Я видел здесь [http://en.wikipedia.org/wiki/Code_page_850], что char \ x10 в codePage 850 соответствует char \ u25ba, и поэтому я думал, что преобразование кодировки должно решить мою проблему. – 2009-05-19 14:26:17

+0

в соответствии со спецификацией XML, процессоры необходимы для обработки UTF-8 и UTF-16. Итак, не можете ли вы кодировать как UTF-8 и отправить своих персонажей через провод на клиентскую сторону? – Cheeso

+0

Нет. Когда я сериализую \ x10, результат равен , который является допустимым символом Unicode, но не является допустимым символом XML. В других странах спецификации XML обрабатывают символы UTF- *, за исключением определенного диапазона символов. См. Здесь [http://www.w3.org/TR/2008/REC-xml-20081126/#charsets] – 2009-05-20 17:25:41

0

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

reEncodedString = sourceEncoding.GetString(targetBytes); 

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

reEncodedString = targetEncoding.GetString(targetBytes); 
0
  1. byte[] sourceBytes =Encoding.Default.GetBytes(value)
  2. Encoding.UTF8.GetString(sourceBytes)

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

0

Вам следует попробовать:

byte[] sourceBytes = sourceEncoding.GetBytes(value); 
var convertedString = Encoding.UTF8.GetString(sourceBytes); 
Смежные вопросы